剑指Offer第二十题:最小的K个数
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
题目分析
这个题是赤裸裸的排序,话不多说,排序方式很多,这个题我使用的是快速排序。
快速排序:将数组的第一个数值作为标记位,然后分别从前往后寻找到大于标记位的位置i,和从后往前寻找到小于标记位的位置j,然后交换i,j的数据位置,再把i位置的数据和标记位的数据交换,然后该数组就分成了左边和右边两部分,分别操作就可以了。快速排序最坏的情况下是O(N^2),平均是O(NlogN)。
源代码
1 /* 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。*/ 2 public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { 3 quicksort(input,0,input.length-1); 4 ArrayList<Integer> arrayList=new ArrayList<>(); 5 if(k>input.length) 6 return arrayList; 7 8 for(int i=0;i<k;i++) { 9 arrayList.add(input[i]); 10 } 11 return arrayList; 12 } 13 14 public void quicksort(int []array,int start,int end) {//快速排序 15 if(start>end) 16 return; 17 int temp=array[start];//标记位,全程将使用这个比较 18 int i=start; 19 int j=end; 20 while(i!=j) { 21 while(array[j]>=temp&&i<j) 22 j--; 23 while(array[i]<=temp&&i<j) 24 i++; 25 if(i<j) { 26 int t=array[i]; 27 array[i]=array[j]; 28 array[j]=t; 29 } 30 } 31 array[start]=array[i]; 32 array[i]=temp; 33 quicksort(array, start, i-1); 34 quicksort(array, i+1, end); 35 36 }