演算法導論筆記之堆排序

2021-05-26 21:29:12 字數 1424 閱讀 4429

堆排序:時間複雜度nlgn

堆是一種特殊的二叉樹,最大堆:根節點的key大於其兩個孩子節點鍵值,依次類推,所以最大值為根,最小值在葉子節點處

ita定義堆的陣列表示法為1-10,所以a[0]暫用無處,比如,長度為10的堆,則用a[1]-a[10]表示,建立時的長度要比實際長度多1

幾個常見操作

heapify:函式原型maxheapify(int *a,int i):表示將陣列a從當前位置i開始建立最大堆(或最小堆),取左右孩子中最大值與根節點交換,並以交換後的孩子結點為i進行遞迴呼叫

build-max-heap:函式原型buildmaxheap(int *a,int length):從length/2位到第1位迴圈呼叫maxheapify函式即可,即保證最後建成的是乙個最大堆

heap-sort:函式原型:heapsort(int *a,int arraylength),使用前提為a已經為最大堆,此時,迴圈length次,每次將a[1]與a[length]交換,則保證a[length]為當前堆的最大值,然後將長度減1,通過呼叫maxheapify再次使剩下部分建成最大堆,重複上面過程

優先順序佇列:(用堆實現)

常用的幾個操作:

heap-max:直接return a[1]即可

exact-max:返回最大值,並取出最大值:返回a[1]後,將a[length]與a[1]交換,並將長度減1,最後執行maxheapify(a,1)即可,即再次建堆

heap-increase-key:函式原型heapincreasekey(int *a,int i,int key),將a[i]的值變為key(key應比a[i]大,否則無意義):問題的關鍵在於a[i]的值變為key後會不會超過原來a[i]的父親節點,因此多加乙個判斷和交換即可

heap-insert:函式原型:heapinsert(int *a,int key):在堆a中插入新元素key

基本思想:length++,這是必須的;將a[length]置為負無窮(即新擴充的那個位置);呼叫heapincreasekey(a,length,key)

原理:因為a[length]手動置為負無窮,所以heapincreasekey(a,length,key)呼叫後key一定比a[length]要大,因此會執行相應操作

將乙個數組建最大堆並進行堆排序的實現(c++)

void exchange(int &a,int &b)

void maxheapify(int *a,int i,int length)

}void printarray(int *a,int arraylength)

coutfor(int i=length/2;i!=0;i--)

}void heapsort(int *a,int arraylength)

}

演算法導論之堆排序

堆排序主要是先建堆,轉化為最大堆,每次把最大的乙個 即最大堆的根節點 和最後乙個交換,這樣每次都把當前最大的乙個放到了最後。堆排序演算法中,最關鍵的就是構造初始堆。需要編寫乙個維護大頂堆性質的函式max heapify。當輸入乙個陣列l和乙個下標i,然後呼叫max heapify時,比較l i l ...

演算法導論之堆排序

二叉 堆,是乙個陣列,可以被看成乙個近似的完全二叉樹,樹上的每乙個節點對應於陣列中的乙個元素。除了最底層之外,該樹是完全充滿的,而且是從左向右填充,a.length表示陣列元素的個數,樹的根結點是a 1 這樣給定乙個節點的下標i,我們很容易計算出其父節點 i 2 左子女 2 i 右子女 2 i 1 ...

演算法導論之堆排序相關

堆排序文件 二叉堆分為兩種 最大堆 最小堆 最大堆 最大元素在根部,在堆的所有結點中,a patent i a i 最小堆 最小元素在根部,在堆的所有結點中,a patent i a i 下面以最大堆為例解釋堆排序的具體過程 首先會用到幾個基本的函式 parent i return i 2 left...