前兩天看了看堆排序算法,啃了半天的書,最后搞明白了堆排序算法,今天有時間給大家說說這個堆排序算法。
首先講一下算法的定義吧!
****算法****:解題方案的準確完整的描述,是解決問題的一系列清晰的指令,用系統(tǒng)的方法去描述解決問題的策略機制
<small>上面是一段比較官方用詞的解釋,我用自己簡單點的話說就是算法就是用來解決問題的清晰的命令</small>
說完算法的定義我們還得說一下有關于算法的基礎的知識點吧!
****樹(tree):****是一種抽象數(shù)據(jù)類型,用來模擬具有樹狀結構性質(zhì)的數(shù)據(jù)集合。它是由n(n>=1)個有限節(jié)點組成一個具有層次關系的集合把它叫做“樹”是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉是朝下的。
特點:
<li><small>每個節(jié)點有零個或多個子節(jié)點;</li>
<li>沒有父節(jié)點的節(jié)點稱為根節(jié)點;</li>
<li>每一個非根節(jié)點有且只有一個父節(jié)點;</li>
<li>除了根節(jié)點外,每個子節(jié)點可以分為多個不相交的子樹;</small></li>
除了上面的這些還有一些比如說樹的度,節(jié)點的度,父節(jié)點,子節(jié)點,兄弟節(jié)點等等這些我就不一一詳細的介紹了,給大家一個網(wǎng)址上面對各個術語的解釋。
https://zh.wikipedia.org/wiki/%E6%A0%91_(%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84)
終于到了堆排序算法了!
****堆排序:****簡單的講就是利用對的性質(zhì)進行的一種選擇排序。
堆分為大頂堆和小頂堆其中大頂堆滿足條件:
小頂堆滿足條件:
基本思想:(大頂堆)
1.將待排序的關鍵字序列(R1,R2,...Rn)構建大頂堆,此堆為初始的無序區(qū).
2.將堆頂元素R[1]與最后一個元素R[n]交換,此時得到新的無序區(qū)
(R1,R2,......Rn-1)和新的有序區(qū)(Rn),且滿足R[1,2...n-1]<=R[n];
3.由于交換后新的堆頂R[1]可能違反堆的性質(zhì),因此需要對當前無序區(qū)(R1,R2,......Rn-1)調(diào)整為新堆,然后再次將R[1]與無序區(qū)最后一個元素交換,得到新的無序區(qū)(R1,R2....Rn-2)和新的有序區(qū)(Rn-1,Rn)。不斷重復此過程直到有序區(qū)的元素個數(shù)為n-1,則整個排序過程完成。
例:對數(shù)組a排序:a[]={16,7,3,20,17,8}
(1)構造樹
(2)構造初始堆
和上圖比較就會知道,我們首先比較子節(jié)點20>17>7
同上8>3
然后比較20,17,8,按照大頂堆得性質(zhì),最大的在最上面然后把最大的放在最后面,和最后一個換位置(Rn)如下圖:
然后在進行排序,17>8>3
繼續(xù)如上各個節(jié)點排序
最后這樣就排完序了