最小的k个数

Posted zhangxiaoyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最小的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 ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        if(input == null)
            return null;
        ArrayList<Integer> list = new ArrayList<Integer>(k);
        if(k > input.length)
            return list;
        int low = 0;
        int high = input.length - 1;
        int index = partition(input,low,high);
        while(index != k-1){
            if(index > k-1){
                high = index - 1;
            }else{
                low = index + 1;
            }
            index = partition(input,low,high);
        }
       for(int i = 0; i < k; i++){
           list.add(input[i]);
       }
        return list;
    }
    //划分操作
    public int partition(int[] array,int start,int end){
        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; 
        return start;
    }
                

 

以上是关于最小的k个数的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer--40最小的k个数

剑指offer--40最小的k个数

最强解析面试题:最小 K 个数

最小的K个数-剑指Offer

最小k个数

剑指offer---最小的K个数