堆
首先,堆是一种逻辑结构,其存储结构是数组。其调整的单元是由三个节点组成,根,左孩子,右孩子。
堆的插入
堆的插入操作是从堆尾插入,然后向上调整。
堆的删除
堆删除元素时从堆顶删除,然后堆尾元素调整到堆顶,再从上往下调整堆。新根是调整单元中的最大值。
堆排序
堆排序,与堆的删除相似。堆排序是将堆顶元素不断的与堆尾元素交换,若是从小到大排序,则将大顶堆的堆顶元素与堆尾元素交换,这样,该堆的最大值将放置在序列的末尾,然后从上往下调整堆。
堆的应用
1.在SQL中,sort函数的底层实现是快速排序,但是快速排序有时效率很低。所以在快速排序的调整次数过多的情况下,会用堆排来救急。
2.C++ SQL中的priority_pueue也是由堆实现的。
#include <iostream>
#include <queue>
using namespace std;
int main() {
priority_queue<int, vector<int>, greater<int> > my;
my.push(23);
my.push(32);
my.push(1);
my.push(4);
while(!my.empty()) {
cout << my.top() << " ";
my.pop();
}
cout << endl;
priority_queue<int, vector<int>, less<int> > my2;
my2.push(13);
my2.push(3);
my2.push(14);
while(!my2.empty()) {
cout << my2.top() << " ";
my2.pop();
}
return 0;
}
堆的时间复杂度
堆的插入:o(logn)
堆的删除:o(1) + o(logn)
堆排序:no(logn)