剑指offer30——topK问题

1 二分法

 vector<int> GetLeastNumbers_Solution(vector<int> input, int k)    
   {    
        int n = input.capacity();
        int start = 0;
        int end = n-1;
        index = partition(input,start,end);
        while(index!=k-1)
        {
            if(index>k-1)
            {
                end = index;
                partition(input,start,end);
            }
            else
            {
                start = index;
                partition(input,start,end);
            }       
        }
        vector<int> res;
        for(int i=0;ireturn res;
    }

打印最大的k个数,只要找到第k大的数即可,不必全部排序。但是书上说这个方法的时间复杂度是o(n),这点我有些疑问。

2 桶排序

第二种方法是用桶排序的方法,时间复杂度是o(n),但空间复杂度较大且数据量较大时不适合用。

3 维护一个最大堆

第三种方法就是维护一个最大堆,每次和最大元素比较,小于则替换,维护最大堆的代价是log(k),所以总的时间复杂度是nlog(k)。

你可能感兴趣的:(数据结构与算法)