最小的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)    收藏  举报

导航