TOP k问题

(1) 最小堆方法

#include

using namespace std;

void heap_adjust(vector&nums,int i, int len) {

       //建立小顶堆,以i节点为根,堆大小为len+1

       intminid = i;

       intleft = i * 2 + 1;

       intright = left + 1;

       if(left <= len && nums[left] < nums[minid])    minid = left;

       if(right <= len && nums[right] < nums[minid])      minid = right;

       if(minid != i) {

              swap(nums[i],nums[minid]);//找到最小值,进行交换

              heap_adjust(nums,minid, len);//递归调整以minid为根的堆

       }

}


vectortopk(vector&nums, int k) {


       //建一个大小为k的堆

       for(int i = k - 1; i >= 0; i--) {

              heap_adjust(nums,i, k - 1);

       }

       for(int j = nums.size() - 1; j >= k; j--) {

              if(nums[j] > nums[0]) {//如果nums[j]比堆顶元素nums[0]小,则不需要改变原来的堆 

                     //如果nums[j]比堆顶元素nums[0]大,那么用nums[j]替换堆顶元素nums[0],在替换之后,需要调整堆来维持最小堆的性质 

                     swap(nums[0],nums[j]);

                     heap_adjust(nums,0, k - 1);

              }

       }

       vectorres(nums.begin(),nums.begin() + k);

       returnres;

}



(2)快排

int partition(vector&nums,int left, int right) {

       intpivot = left + rand() % (right - left + 1);

       swap(nums[pivot],nums[left]);

       inttmp = nums[left];

       while(left < right) {

              while(left < right && nums[right] < tmp) {

                     right--;

              }

              nums[left]= nums[right];//从后往前第一个大于tmp的值

              while(left= tmp) {

                     left++;

              }

              nums[right]= nums[left];//从前往后第一个小于tmp的值

       }

       nums[left]= tmp;//left前的都大于nums[left],left后的都小于nums[left]

       returnleft;

}


vectorquicksort(vector&nums,int left, int right, int k) {

       intpos = partition(nums, left, right);


       if(pos == k) {

              vectorres(nums.begin(),nums.begin() + k + 1);

              returnres;

       }

       elseif (pos < k) {

              returnquicksort(nums, pos + 1, right, k);

       }

       else{

              returnquicksort(nums, left, pos - 1, k);

       }

}



int main() {

       vectornums{15,6,7,8,8,10,16,12,13,14 };

       intk = 4;

       vectorres= quicksort(nums, 0, nums.size() - 1, k - 1);

       system("pause");

       return0;

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容