堆排序 選擇排序的升級

   選擇排序的思想是每次選擇未排序列中最小值的下標,使它對應的值與未排序數列中第一個的值交換內容。從而達到選擇的目的。
  
而堆排序就是每次調整後,選出最大值在堆頂,然後使堆頂放入數列末尾,然後數列長度減1,
這樣就總使未排數列中的最大值放在未排數列的最後一位。

然而怎麼確定數列中最大的數呢,如果遍歷未排數列 一個一個去比,那顯然就是一般的選擇排序了
但我們要升級,我們要牛逼,我們要高大上,其實最重要的還是減少操作。
因此引入了堆 或者叫二叉樹的方法。


堆的思想是什麼呢,抽象點說什麼左子樹和右子樹和 樹根的什麼關係 2 *i 2*i+1之類的顯然不是人話。
那乾脆就簡單點,實幹點。你先把一個數列按大樹的形狀挨個排下來。自己找找規律看

分叉的左邊就是左子樹 右邊就是右子樹     看看下標什麼關係,1和2是不是2倍! 1和3是不是2倍+1。

二叉樹和排序有什麼關係呢?當然有關係!
我們可以看到目前二叉樹是完全亂序的,意思就是樹根和子樹沒有大小關係,我們要做的就是調整,調整的目標就是讓所有樹根都比它的子樹們大!這樣調整下來的結果就是堆頂,總跟,變爲最大的數。這就是我們所要的東西!未排序列中最大的數(或最小的數)。然後讓最大數放到堆底最後一個,使堆總長度-1. 反覆循環這一步,那不就全部有序了嗎?

以下是代碼:



10萬個隨機數據測試:


時間複雜度均爲 O(nlog2n)

穩定性是不穩定的。一旦一層數字調整了發生了向上交換,那就跳躍式交換數據了,無法保證相同的值的位置關係