大根堆(大顶堆)代码示例

  1. 大顶堆可以视为一个完全二叉树,满足根节点同时大于左右节点,大顶堆的最大元素放置于根节点。
  2. C++中优先队列的底层是大顶堆
  3. 在顺序存储的完全二叉树中,非终端节点的编号i<=[n/2];n是元素个数,同时对非分终端节点i,左孩子的编号是2i,右孩子的编号是2i+1.i的父节点是[i/2];
    #include 
    using namespace std;
    void HeadAdjust(int A[], int k, int len);
    //建立大根堆
    void BuildMaxHeap(int A[],int len)
    {
        for (int i = len / 2; i > 0; i--)
        {
            HeadAdjust(A, i, len);
        }
    }
    //下坠
    void HeadAdjust(int A[], int k, int len)
    {
        A[0] = A[k];
        for (int i = 2 * k; i <= len; i *= 2)
        {
            if (i < len && A[i] < A[i + 1]) i++;//取k较大的子节点
            if (A[0] >= A[i]) break;//已经满足根>左,右
            else
            {
                A[k] = A[i];//将较大的节点放置于A【k】,重新进行A[i]的根节点的建立
                k = i;
            }
        }
        A[k] = A[0];
    }
    void HeapSort(int A[], int len)
    {
        for (int i = len; i > 1; i--)
        {
            swap(A[i], A[1]);
            HeadAdjust(A, 1, i - 1);
        }
    }
    int main() {
        int* a = new int[9]{0,53, 17, 78, 9, 45, 65, 87, 32};
        BuildMaxHeap(a, 8);
        HeapSort(a, 8);
        for (int i = 1; i <= 8; i++)
        {
            cout << a[i] << endl;
        }
        delete[]a;
        return 0;
    }

你可能感兴趣的:(算法,数据结构)