互動設計演算法基礎(8) Heap Sort

2022-05-30 23:39:18 字數 1530 閱讀 2630

堆排序是一種樹形選擇排序,是對直接選擇排序的有效改進。

堆的定義如下:具有n個元素的序列(k1,k2,...,kn),當且僅當滿足時稱之為堆。由堆的定義可以看出,堆頂元素(即第乙個元素)必為最小項(小頂堆)。

若以一維陣列儲存乙個堆,則堆對應一棵完全二叉樹,且所有非葉結點的值均不大於(或不小於)其子女的值,根結點(堆頂元素)的值是最小(或最大)的。如:

(a)大頂堆序列:(96,83,27,38,11,09)

(b)小頂堆序列:(12,36,24,85,47,30,53,91)

基本思想:初始時把要排序的n個數的序列看作是一棵順序儲存的二叉樹(一維陣列儲存二叉樹),調整它們的儲存序,使之成為乙個堆,將堆頂元素輸出,得到n 個元素中最小(或最大)的元素,這時堆的根節點的數最小(或者最大)。然後對前面(n-1)個元素重新調整使之成為堆,輸出堆頂元素,得到n 個元素中次小(或次大)的元素。依此類推,直到只有兩個節點的堆,並對它們作交換,最後得到有n個節點的有序序列。稱這個過程為堆排序。

時間複雜度分析:o(nlog(n)),堆排序是一種不穩定的排序演算法。

因此,實現堆排序需解決兩個問題:

1. 如何將n 個待排序的數建成堆?

2. 輸出堆頂元素後,怎樣調整剩餘n-1 個元素,使其成為乙個新堆?

首先討論第二個問題:輸出堆頂元素後,怎樣對剩餘n-1元素重新建成堆?

調整小頂堆的方法:

1)設有m 個元素的堆,輸出堆頂元素後,剩下m-1 個元素。將堆底元素送入堆頂((最後乙個元素與堆頂進行交換),堆被破壞,其原因僅是根結點不滿足堆的性質。

2)將根結點與左、右子樹中較小元素的進行交換。

3)若與左子樹交換:如果左子樹堆被破壞,即左子樹的根結點不滿足堆的性質,則重複方法 (2)

4)若與右子樹交換,如果右子樹堆被破壞,即右子樹的根結點不滿足堆的性質。則重複方法 (2)

5)繼續對不滿足堆性質的子樹進行上述交換操作,直到葉子結點,堆被建成。

稱這個自根結點到葉子結點的調整過程為篩選。

再討論第乙個問題,如何將n 個待排序元素初始建堆?

建堆方法:對初始序列建堆的過程,就是乙個反覆進行篩選的過程。

1)n 個結點的完全二叉樹,則最後乙個結點是第n/2個結點的子樹。

2)篩選從第n/2個結點為根的子樹開始,該子樹成為堆。

3)之後向前依次對各結點為根的子樹進行篩選,使之成為堆,直到根結點。

堆排序:

void heapsort(int a, int

n) }

建堆:

void heapbuilding(int a, int

n)

調整堆:

void heapadjusting(int a, int root, int

n)

else

break

;

//將調整前父節點的值賦給調整後的位置。

a[root] =temp;

}}

互動設計演算法基礎(11) Merge Sort

基本思想 歸併 merge 排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。演算法流程 迭代 兩個有序數列合併為乙個有序數列 時間複雜度 o nlog n 歸併演算法是一種穩定排序演算法。歸併排序 vo...

互動設計實用指南系列 8 深廣度平衡

圖1從右側這家店的櫥窗裡,我們能迅速分清哪些是租房資訊哪些是售房資訊。因為店家很貼心的將房產資訊進行歸類,並且在視覺上做了一些劃分,讓我們對資訊能一目了然。借這個小案例引出我們今天要分享的話題 深廣度平衡。其實 深廣度 本身並不是乙個單一的概念。在 的資訊架構中,有一種組織結構叫做樹形結構 首頁視為...

零基礎怎麼轉行學UI 如何掌握UI互動設計

眾所周知,ui設計是指對軟體的人機互動 操作邏輯 介面美觀的整體設計,由此可見想要成為乙個合格的ui設計師一定要掌握互動設計。值得一提的是ui設計入行門檻低,薪資福利卻很可觀,這吸引了很多人轉行學習,那麼0基礎學ui如何掌握互動設計呢?下面一同來看看吧。什麼是互動?互動,即交流互動,是現在的很多網際...