c++关于堆

首先,堆是一种逻辑结构,其存储结构是数组。其调整的单元是由三个节点组成,根,左孩子,右孩子。

堆的插入

堆的插入操作是从堆尾插入,然后向上调整。

堆的删除

堆删除元素时从堆顶删除,然后堆尾元素调整到堆顶,再从上往下调整堆。新根是调整单元中的最大值。

堆排序

堆排序,与堆的删除相似。堆排序是将堆顶元素不断的与堆尾元素交换,若是从小到大排序,则将大顶堆的堆顶元素与堆尾元素交换,这样,该堆的最大值将放置在序列的末尾,然后从上往下调整堆。

堆的应用

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)

猜你喜欢

转载自blog.csdn.net/weixin_42946821/article/details/82958270