1. 程式人生 > >堆排序演算法的圖文詳解

堆排序演算法的圖文詳解

堆排序演算法的圖文詳解


堆排序過程主要由三個步驟組成:

  • 構建大頂堆/小頂堆
  • 構建初始化堆
  • 排序

貫穿整個堆排序過程的一個重要演算法就是對堆進行調整。下面我們按照上面三個步驟介紹詳細的堆排序過程。(這裡我們以大頂堆為例展開介紹)

建立初始化堆

給定一個數組Array=[4, 12, 3, 2, 16, 10, 14, 8, 7]
Step1:構建一個完全二叉樹
根據陣列建立一個完全二叉樹

Step2:初始化大頂堆,從編號為5的節點開始進行調整(由於堆排序是自底向上的排序方式,從編號最大的內節點開始調整)。調整的思路:如果i號節點比它的兩個子節點都大,那麼就不進行調整;如i號節點比子節點小,那麼選擇最大的子節點與i號節點進行交換。
初始化大頂堆

  • 左上熒游標記部分得到16>7,因此保持原狀態不變
  • 右上熒游標記部分通過比較[2, 4,8],可以得出14最大,那麼將14與2交換,得到區域性堆
  • 左下圖中可以看出[3, 9, 10]中,10最大,將3與10進行交換
  • 直到交換到編號1為止,此時編號1位置的值最大
  • 如下圖所示,是第一輪調整過後的模型,但此時還不是大頂堆
    繼續調整該二叉樹
    由於4與16發生了交換,導致該樹的左子樹的堆結構被破壞,因此需要進行重新調整。但是我們直到以4為根節點的兩個子樹在前面已經是堆結構了,那麼我們在調整時,直接比較[4, 14, 12]之間哪個最大,選擇最大的那個值與4交換,我們發現14最大,因此14與4做交換。實質上,這就是一個自頂向下的調整過程。直到最後的模型成為堆結構為止。最後的堆結構模型如下圖所示:
    初始化大頂堆結構模型

    目前,我們已經完成了初始化堆模型的構建。接下來我們將進行堆排序操作。一會我們可以看到,對於堆的排序,實際上也是一個不斷調整堆的過程。

堆排序

Step3:堆排序。基本思想:交換a[1]和a[length],將第一個元素與最後一個元素交換,因為根據我們Step2中的操作,我們已經得到了該陣列中的最大值,我們將最大值扔到末尾,然後在對剩下的元素a[1……9]進行堆調整,然後我們就可以得到第二大的元素,再把第二大元素扔到剩下元素的末尾,不斷進行該操作,我們最後就可以完成堆排序了。
下面我們將用圖作為演示:

  • 第一次交換,交換a[1]和a[10](即交換16和7)
    第一次交換
    交換以後最大的元素到了編號為10的位置,將該節點從堆中摘除,後續排序中不用再考慮它了。可以發現,a[1……9]的堆結構又被破壞了,咱們按照前面的調整方案繼續對該堆進行調整。藍色筆跡部分就是調整後的堆結構。當結構再次程式設計堆結構時,咱們再重複上面的交換操作,這一次就交換a[1]和a[9],那麼第二大的元素就到了編號為9的位置了,將該節點從堆中摘除。繼續對破壞了的堆結構進行調整,直到所有的節點都從結構為堆的二叉樹上被摘除為止。
  • 第二次交換,交換a[1]和a[9]:
    第二次交換
  • 第三次交換,交換a[1]和a[8]:
    第三次交換
    步驟都是一樣的,就不全部展示了,下面放出最後的結果
  • 最後的結果圖如下所示:
    最終排序結果