来源:互联网 发布:java goto语句 编辑:程序博客网 时间:2024/05/20 02:52

 搞得好像多么高大上的样子

1.最大堆 : 父节点的值大于左右孩子节点的值的完全二叉树

2.最小堆:父节点的值小于左右孩子节点的值的完全二叉树


瞬间转化成二叉树的问题了


以下是编程珠玑的关于堆的代码:

// 最大堆实现, 数组下标从1开始,a[0]不使用。// 交换两数void swap(int &a, int &b) {    int t = a;    a = b;    b = t;}// 把第i个元素向上移动void ShiftUp(int a[], int i) {    while(i>1 && a[i]>a[i/2]) {        swap(a[i], a[i/2]);        i >>= 1;    }}// 把第i个元素向下移动void ShiftDown(int a[], int n, int i) {    while((i=2*i) <= n) {        if(i+1<=n && a[i+1]>a[i]) ++i;        if(a[i] > a[i/2]) swap(a[i], a[i/2]);        else break;    }}// 把数组a变成具备最大堆性质的数组void MakeHeap(int a[], int n) {    for(int i=n/2; i>0; --i)        ShiftDown(a, n, i);}// 向堆中插入元素xvoid Insert(int a[], int &n, int x) {    a[++n] = x;    ShiftUp(a, n);}// 删除堆中第i个元素void Del(int a[], int &n, int i) {    a[i] = a[n--];    if(i>1 && a[i]>a[i/2]) ShiftUp(a, i);    else ShiftDown(a, n, i);}// 堆排序,时间复杂度O(nlogn)void HeapSort(int a[], int n) {    MakeHeap(a, n);    for(int i=n; i>1; --i) {        swap(a[i], a[1]);        ShiftDown(a, i-1, 1);    }}



0 0