讀《程序員編程藝術》之自造Java版本-----插入排序實現最小K問題

本人最近想提高一下自己的編程能力,因此對《程序員編程藝術》進行拜讀,網址爲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();
}

}



其實驗結果爲:請輸入K的值641 25 81 5 4 36 10 63 57 67 21 77 91 30 59 37 85 86 83 24 77 22 83 82 94 17 50 28 36 4 82 42 10 89 90 37 26 64 29 33 47 87 92 1 28 45 27 44 65 0 55 36 9 91 85 74 23 47 47 0 45 38 8 35 6 86 70 18 39 84 74 88 63 49 45 94 81 91 59 25 15 29 22 2 76 88 23 93 78 54 52 36 79 36 58 68 55 25 4 51 最終結果爲:0 0 1 2 4 4
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章