堆排序實現

Heapify
基本思想:將一個完全二叉樹所有的葉子節點先分別都視爲一個最大堆,然後對第一個非葉子結點進行shiftDown操作,使得該節點和它的葉子節點構成一個最大堆。依次對第二、三個非葉子節點進行同樣的操作,直到整個堆變成一個最大堆。

對於一個完全二叉樹,第一個非葉子節點的索引是完全二叉樹的元素個數除2得到的值。

具體實現:
添加新的公有構造函數

MaxHeap(Item arr[], int n){
        data = new Item[n+1];
        capacity = n;

        for( int i = 0 ; i < n ; i ++ )
            data[i+1] = arr[i];
        count = n;

        for( int i = count/2 ; i >= 1 ; i -- )
            shiftDown(i);
    }

第二種堆排序:

template<typename T>
void heapSort2(T arr[],int n){
    MaxHeap<T>maxheap=MaxHeap<T>(arr,n);
    //倒序賦值
    for(int i=n-1;i>=0;i--)
        arr[i]=maxheap.extractMax();
}

注:
將n個元素逐個插入到一個空堆中,算法複雜度是O(nlogn)
heapify的過程,算法複雜度是O(n)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章