Top K问题(求前k个最大的数)
最近在笔试的时候经常会遇到求前k个最大的数的算法,查阅了一些资料,总结如下:
在数据不多的情况下采用快速排序,在海量数据下则采用堆排序。
以下将针对这两种方法给出详细的实现代码,希望能帮到大家,顺便替自己复习一下,如果发现有错的,欢迎指正。
一、快速实现前k个最大数据的排序,总数据为n个
1、以下的partition函数对线性表从low到high进行一趟快速排序
void KHeapSort(HeapType &H){for(int i=H.length/2;i>0;--i)HeapAdjust(H,i,H.length);//把H.r[1..H.length]建成大顶堆,从非终端结点开始for(int i=H.length;i>H.length-k;--i)H.r[1]<——>H.r[i];//将堆顶元素和当前未经排序子序列H[1..i]中最后一个记录相互交换HeapAdjust(H,1,i-1);//将H.r[1..i-1]重新调整为大顶堆}}