最大的K个数

Posted 樱圃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大的K个数相关的知识,希望对你有一定的参考价值。

建立最大的k个数,可以通过快速排序来实现,也可以通过堆排序来实现。我们来看堆排序的实现过程。

其中,也是有两种思路:第一种思路是:把数组里的所有的数建堆(O(nlogn)),然后交换k次,通过堆排序实现。(klogn)

  时间复杂度是:O((n+k)logn) = O(nlogn)

第二种思路是:先用前面的k个数来建最小堆,堆顶元素将会是这个堆里的最小值,然后从第K+1个数开始和堆顶元素进行比较,若此值比堆顶元素小,则这个数比大的至少有k个元素,这个值肯定不是最大的k个数;若此值比堆顶元素大,则这个数有可能是最大的k个数,调整这个堆即可。最后建立的堆就是所求的最大的k个数,并且堆顶元素就是最大的k个数中的最小值。

时间复杂度是:(O(klogk)+O(n-k)logk) = O(nlogk)

第二种思路的代码:

public int[] heapSort(int[] array,int k){
        int length = array.length;
        for(int i=(k-2/2);i>=0;i--){  //先建立具有K个元素的大顶堆
            adjustHeap(array,i,k-1);
        }
        for(int i=k;i<array.length;i++){ //比较n-K次
            if(array[0]>array[i])
            {
                swap(array,0,i);
                adjustHeap(array,0,k-1);
            }
        }
        return array;
    }
    public void adjustHeap(int[] array,int m,int n){
        while(2*m+1<=n){
            int p = 2*m+1;
            if(p<n){
                if(array[p]<array[p+1]){
                    p=p+1;
                }
            }
            if(array[m]<array[p]){
                swap(array,m,p);
                m = p;
            }else{
                break;
            }
            
        }
    }
    public void swap(int[] array,int p,int q){
        int temp = array[q];
        array[q] = array[p];
        array[p] = temp;
    }

 

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

尺取法

最大的K个数

hdu4106 区间k覆盖问题(连续m个数,最多选k个数) 最小费用最大流 建图巧妙

寻找最大的K个数

寻找最大或最小的K个数

剑指offer二十九---最小的k个数