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