資料結構與算是 實現堆排序

2021-07-12 06:32:59 字數 1383 閱讀 8545

堆排序(基於堆的優先佇列實現的)

首先介紹一下二叉堆及其相關的演算法

1.堆在二叉堆中,每個元素都***大於等於另兩個特定位置的元素,根結點是堆有序二叉樹中最大結點。

我們有完全二叉樹來表示堆,先定下根結點。然後一層一層地由上向下、由左向右,每個結點的下方連線兩個更小的結點,直到將n個結點全部連線完畢。

如下圖就是乙個二叉堆的結構

在乙個堆中,位置k結點的父結點的位置為[k/2],而它的兩個子節點的位置分別為2k和2k+1。這樣可以通過利用陣列的索引來儲存這個二叉堆。

2.堆的演算法

堆的演算法:插入元素和刪除最大元素

用長度為n+1的陣列p[]來表示乙個大小為n的堆,不使用p[0]。

在有序化的過程中有兩種情況:

當在堆底加入乙個新的元素時或某個元素的優先順序上公升,需要由下至上恢復堆的順序;

當根結點替換成乙個較小的元素時或某個結點的優先順序下降,需要由上至下恢復堆的順序。

(1)由下至上的堆有序化(上浮,swim)

當某個結點比它的父結點大的時候,我們需要通過交換這兩個元素來恢復堆的有序性。交換以後這個結點有可能比它的父結點還大,那麼繼續這個過程,直到我們遇到更大結點或者到達根節點。只要記住位置k的父結點的位置為[k/2]。【**會在下面程式中給出】

應用:插入元素,我們將新元素加到陣列的末尾,增加堆的大小並讓這個元素上浮到合適的位置

(2)由上至下的堆優化(下沉,sank)

當某個結點比它的兩個子結點或者其中之一小的話,通過將它和它的兩個結點中的較大者交換來恢復堆的有序性。交換以後這個結點有可能比它現在的兩個子結點還小,那麼繼續這個過程,直到我們遇到比它小的兩個結點或者到達堆底。這裡記住,位置為k的結點的子結點位於2k和2k+1的位置,注意邊界需要與n進行比較。【**會在下面程式中給出】

應用:刪除最大元素,我們從陣列的頂端刪除最大的元素並將陣列的最後的乙個元素放到頂端,減去堆的大小並讓這個元素下沉到合適的位置。

3.堆排序

堆排序分為兩個階段:堆的構造階段和下沉排序階段

(1)構造階段

堆中每個位置都是乙個子堆的根節點,在子堆上使用下沉操作。

(2)下沉操作

刪除堆中的最大的元素,然後放人最後元素的位置並縮小陣列的大小。

void siwm(int* a, int n, int k) //上浮操作

else

break; }}

void sink(int* a, int n,int k) //下沉操作

else

break; }}

void heapsort(int* a, int n)

}

資料結構與演算法 堆排序 python實現

def heap sort arr max index len arr 1 構建大頂堆,0位置上為最大值 heap swift arr,0,max index end index 為每次得到最大值後,最大值應該放的位置 for end index in range 1,max index 1 rev...

資料結構 堆排序(c 實現)

一 堆排序的定義 堆排序是一種樹形選擇排序,在排序過程中可以把元素看成是一顆完全二叉樹,每個節點都大 小 於它的兩個子節點,當每個節點都大於等於它的兩個子節點時,就稱為大頂堆,也叫堆有序 當每個節點都小於等於它的兩個子節點時,就稱為小頂堆。二 堆排序演算法 1.將長度為n的待排序的陣列進行堆有序化構...

資料結構與演算法 堆排序

1 堆的性質 堆是一棵完全二叉樹,除最後一層外每層都是滿的 元素個數為2 i 1 根節點為第1層 最後一層如果不滿則只缺少右邊葉結點。如果按照廣度優先,即從上至下,從左至右對節點編號。根節點序號為0,節點i的父節點是 i 1 2,左子節點是2 i 1。最小堆中任意父節點不能比子節點大,最大堆中任意父...