堆排序中求前K个最小数

来源:互联网 发布:js截取子字符串 编辑:程序博客网 时间:2024/06/03 03:56
01.#include "iostream"  02.#include "vector"  03.#include "algorithm"  04.using namespace std;  05.void HeapAdjust(std::vector<int> &a,int i,int size){ 06.    int lchild = 2*i + 1; 07.    int rchild = 2*i + 2; 
 08.    int max = i;  
09.    if(i < size/2 ){10.        if(lchild<size&&a[lchild]>a[max]) max = lchild; 
 11.        if(lchild<size&&a[rchild]>a[max]) max = rchild; 12.        if(max != i){  
13.            swap(a[i],a[max]);  14.            HeapAdjust(a,max,size);  15.        }  16.    }  17.}  18.void BuildHeap(std::vector<int> &a,int k){  19.    for (int i = k-1; i >= 0; --i)  20.    {  21.        HeapAdjust(a,i,k);  22.    }  23.}  24.int main(int argc, char const *argv[])  25.{  26.    std::vector<int> a(6);  27.    a[0] = 3;a[1] = 11; a[2] = 8;a[3] = 2;  28.    a[4] = 9;a[5] = 4;  29.    int k = 3;//取前k最小的  30.    BuildHeap(a,k);  31.    for (int i = k; i < a.size(); ++i)  32.    {  33.        if(a[0] > a[i]) {  34.            swap(a[0],a[i]);  35.            HeapAdjust(a,0,k);  36.        }  37.    }  38.    for (int i = 0; i < k; ++i)  39.    {  40.        cout<<a[i]<<"\t";  41.    }  42.    return 0;  43.}  


0 0