本人最近想提高一下自己的編程能力,因此對《程序員編程藝術》進行拜讀,網址爲http://blog.csdn.net/v_JULY_v/article/details/6460494
深深的爲作者的無私所震撼,因此想把自己的個人體會和程序貼出來,一來希望對他人有所幫助,二來加深自己的理解。不足指出多指正!
針對第三章求最小K問題,根據作者的思想,對其在Java上進行了實現:
方法一:採用直接插入排序算法,只需求出其前K個最小的值即可。在此沒有應用作者的思路,二是對其前K個值全部排序,時間複雜度nlogn,但是在規模上減小了。
package minK;
import java.util.Random;
import java.util.Scanner;
/*
* 查找一組數據中最小的K個數
* 可以使用快速排序的方式對數據全部排序
* 本文要求並未全部排序,只需查找其中K個最小的值即可,故採用插入排序的方式,對前K個數據進行排序,而後比較
* 2015年4月8日 16:17:49
*
*/
public class InsertSelect {
//int numb[]={11,8,10,6,92,2,7,3,10,8,4,5,9,1,40};
int numb[]=new int[100];
int k;
//構造100個隨機數
public void Random() {
int max=100;
Random random=new java.util.Random();
for (int i = 0; i < numb.length; i++) {
numb[i]=random.nextInt(max);
}
}
//輸入K的值
public void Getk() {
Scanner in=new Scanner(System.in);
System.out.println("請輸入K的值");
k=in.nextInt();
}
//通過插入排序實現
public void Insert( ) {
for (int i = 0; i < k; i++) {
if(numb[i+1]<numb[i]){
for (int j = i; j >=0; j--) {
if(numb[i+1]>numb[j]){//尋找比欲插入的數小的數,向後移動,插入數據
int middd=numb[i+1];
for(int t=i+1;t>=j+1;t--){
numb[t]=numb[t-1];
}
numb[j+1]=middd;
break;
}
if(j==0){//當插入數據最小時,搜尋到開頭位置,進行移動,賦值
int midd=numb[i+1];
int f=i;
while(f>=0){
numb[f+1]=numb[f];
f--;}
numb[0]=midd;
break;
}
}
}
}
//對K之後的數據進行比對,有小值時,移動替換
for (int i = k; i < numb.length; i++) {
if (numb[i]<numb[k-1]) {
for(int j=k-1;j>=0;j--){
if (numb[j]<numb[i]) {
int mid3=numb[i];
for(int s=k;s>j+1;s--){
numb[s]=numb[s-1];
}
numb[j+1]=mid3;
break;
}
else if (j==0) {
int mid4=numb[i];
for(int s=k;s>0;s--){
numb[s]=numb[s-1];
}
numb[0]=mid4;
break;
}
}
}
}
}
//爲方便顯示,做兩個輸出函數
public void Out() {
for (int i = 0; i < numb.length; i++) {
if(i%10==0){
System.out.println();
}
System.out.print(numb[i]);
System.out.print(" ");
}
System.out.println();
}
public void outall() {
System.out.println("最終結果爲:");
for (int i = 0; i < k; i++) {
System.out.print(numb[i]);
System.out.print(" ");
}
}
public static void main(String[] args) {
InsertSelect abc=new InsertSelect();
abc.Getk();
abc.Random();
abc.Out();
abc.Insert();
abc.outall();
}
}