码迷,mamicode.com
首页 > 其他好文 > 详细

最小的k个数

时间:2017-08-25 16:51:38      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:最小数   ret   最小的k个数   inpu   最小   public   dex   input   ++   

输入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个数

标签:最小数   ret   最小的k个数   inpu   最小   public   dex   input   ++   

原文地址:http://www.cnblogs.com/joshsung/p/7428533.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!