最小的k个数
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
快排序的思想就是把a[begin] 交换到它属于的第k位
- 利用快速排序划分的思想,每一次划分就会有一个数字位于以数组从小到达排列的的最终位置index;
- 位于index左边的数字都小于index对应的值,右边都大于index指向的值;
- 所以,当index > k-1时,表示k个最小数字一定在index的左边,此时,只需要对index的左边进行划分即可;
- 当index < k - 1时,说明index及index左边数字还没能满足k个数字,需要继续对k右边进行划分;
public java.util.ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { java.util.ArrayList<Integer> list = new java.util.ArrayList<Integer>(k); if(input == null||k > input.length||k<1) return list; int low = 0; int high = input.length - 1; partition(input,low,high,k); for(int i = 0; i < k; i++){ list.add(input[i]); } return list; } //划分操作 public void partition(int[] array,int s,int e,int target){ int start =s; int end =e; int pivot = array[start]; while(start < end){ while(start < end && array[end] >= pivot) end--; if(start<end) array[start++] = array[end]; while(start < end && array[start] <= pivot) start++; if(start<end) array[end--] = array[start]; } array[start] = pivot; if(start ==target-1){ return; }else if(start>target-1){ partition(array,s,start-1,target); }else if(start<target-1){ partition(array,start+1,e,target); } }
posted on 2017-08-25 16:11 zhangxiaoyu 阅读(144) 评论(0) 收藏 举报
浙公网安备 33010602011771号