读《程序员编程艺术》之自造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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章