1》优先队列:在C++中优先队列默认的是大根堆,如果用小根堆则加入greater.

priority_queue<int, vector<int>, less<int>>s;//less表示按照递减(从大到小)的顺序插入元素
priority_queue<int, vector<int>, greater<int>>s;//greater表示按照递增(从小到大)的顺序插入元素

不写第三个参数或者写成less都是大根堆。greater是小根堆。

2》实际应用中我们借助于数组vector来建堆。

vector<int> a;
make_heap(a.begin(),a.end(), less<int>() );//建立大根堆
make_heap(a.begin(),a.end(), greater<int>() );//建立小根堆
push_heap(a.begin(),a.end();//将最后一个元素插入堆中(堆自动调整)
pop_heap(a.begin(),a.end();//将第一个元素从堆中删去(堆自动调整),并放到最后

3》举例:

/*
【502】给定一个整数数组,如何快速地求出数组中第k小的数。假如数组为:{4,0,1,0,2,3}。
*/
#if 1
int getMin(int* a,int len, int k) {
    vector<int>V;
    V.assign(a, a + len);
    int res;
    for(int i=0;i<k;i++){
        make_heap(V.begin(), V.end(), greater<int>());//把greater去掉就变成了小根堆,本题就变成求第k个最大值。
        pop_heap(V.begin(), V.end());
        res = V[V.size()-1];
        V.pop_back();
    }
    return res;
}
int main() {
    int a[6] = { 4,0,1,0,2,3 };
    cout << getMin(a, 6, 4) << endl;
    return 0;
}
#endif

第四小的数字是:
在这里插入图片描述
其他一些关于堆的函数用法 参照:
其他函数应用

/*
真题496:每20个数组,每个数组有50个元素,并且使有序的,现在如何在这20*500个数组中找出排名前5的数。
*/
#if 0
#define rows  3
#define cols  5
//int num[rows][cols] = { {29,17,14,2,1},{19,17,16,15,6},{30,25,20,14,5} };
int num[rows][cols] = { {1,2,14,17,29},{6,15,16,17,19},{5,14,20,25,30} };
struct Node {
    int * p;//指向数组的指针,便于取下一个数字
    bool operator<(const struct Node& node)const {
        return *p > *node.p;
    }
 };
void gettop(int k){
    struct Node arr[rows];
    int* res = new int[k];
    for (int i = 0; i < rows; ++i)
        arr[i].p = num[i];//初始化指针指向各行的首位
    //优先队列默认是大堆,这块是自己去设置的大堆。
    priority_queue<Node>myq(arr, arr + rows);
    for (int j = 0; j < k && j < cols; ++j) {
        Node tmp = myq.top();
        myq.pop();
        res[j] = *tmp.p;
        tmp.p++;
        myq.push(tmp);
    }
    for (int i = 0; i < k; ++i) {
        cout << res[i]<<" ";
    }
    cout << endl;
}
int main() {
    int k = 5;
    gettop(5);
    return 0;
}
#endif
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐