题目:输入n个数,输出最小的k个数。
时间复杂度为O(n)
思路1:我们想的到的最直接的思路就是对这个N个数进行排序,然后就可以找到最小的k个了,同样可以用快排partition。但是只要找到前K个最小的元素,并不一定要排好序。
Java代码:
import java.util.Random; //时间复杂度为O(n); public class PreKOfArray { //一趟快速排序 public int partition(int[] a,int start,int end){ if(a==null) return -1; Random rand=new Random(); int index=start+rand.nextInt(end-start); swrap(a,index,end); int small=start-1; for(index=start;index<a.length;index++){ if(a[index]<a[end]){ small++; if(small!=index) swrap(a,index,small); } } small++; swrap(a,small,end); return small; } public void swrap(int[] a, int index, int end) { int temp=a[index]; a[index]=a[end]; a[end]=temp; } public void printMinKOfArray(int[] input,int[] output,int k){ if(input==null||output==null||k>input.length||k<=0) return; int start=0; int end=input.length-1; int index=partition(input,start,end); //找到前k个最小的数字 while(index!=k-1){ if(index>k-1){ end=index-1; index=partition(input,start,end); } else{ start=index+1; index=partition(input,start,end); } } for(int i=0;i<k;i++){ output[i]=input[i]; } for(int z:output) System.out.println(z+","); } public static void main(String[] args){ int[] a={2,3,1,4,9,0,5,6,7,8}; int k=5; int[] b=new int[k]; PreKOfArray poa=new PreKOfArray(); poa.printMinKOfArray(a, b, 5); } }