02输入n个数,找出其中最小的k个数,例如输入4,5,1,6,2,7,3,8,个数字,则最小的数字是1,2,3,4。
【解析】基于O(n)的算法,可以用基于Partion函数解决这个问题,如果基于数组的第k个数字来调整,使得比第k个数字小的所有数字都位于数组的左边,比第k个数组大的所有数字都位于数组的右边,这样调整之后数组左边的k个数字就是最小的k个数字,不一定有序。importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerin=newScanner(System.in);intn=in.nextInt();intk=in.nextInt();int[]num=newint[n];int[]out=newint[k];for(inti=0;i<n;i++){num[i]=in.nextInt();}booleanb=GetMinK(n,num,k,out);if(b){for(inti=0;i<k;i++){System.out.print(out[i]+"");}}}publicstaticbooleanGetMinK(intuiInputNum,int[]pInputArray,intuiK,int[]pOutputArray){if(pInputArray==null||pOutputArray==null||uiK>uiInputNum||uiInputNum<=0||uiK<=0){returnfalse;}intstart=0;intend=uiInputNum-1;intindex=partition(pInputArray,start,end);while(index!=uiK-1){if(index>uiK-1){//index在k-1的右边end=index-1;index=partition(pInputArray,start,end);}else{start=index+1;index=partition(pInputArray,start,end);}}for(inti=0;i<uiK;i++){pOutputArray[i]=pInputArray[i];}returntrue;}//partion分区函数,返回数组a的首元素快排的索引值indexpublicstaticintpartition(int[]a,intstart,intend){intprivot=a[start];inti=start;intj=end;while(i<j){while(i<j&&privot<=a[j]){j--;}swap(a,i,j);while(i<j&&privot>=a[i]){i++;}swap(a,i,j);}returni;}publicstaticvoidswap(int[]a,inti,intj){intt=a[i];a[i]=a[j];a[j]=t;}}
来自:排序算法-高级排序(快排、堆排等)