主要是理解思路,思路有了**則是水到渠成。
堆排序實際是陣列排序,使用陣列的下標構造成乙個二叉樹,想法很有意思。
加入有陣列a,那可以把a[0]視為根節點,它的子節點為a[2*0+1],a[2*0+2],即對於任何乙個節點a[i],則有子節點a[2*i+1]和a[2*i+2]。
1. 構建乙個大頂堆,構建成功後a[0]便是最大的。
2. 之後交換a[0]和a[len(a)-1]
3. 然後在調整a[:len(a)-2](把a[len(a)-1]排除在外)為大頂堆
4. 重複上面的步驟
5. 得到有序陣列
package mainimport (
"fmt"
)func adjustheap(a int, pos int, lenght int)
// 找出孩子中較大的那個
if a[child+1] > a[child]
// 檢查孩子是否大於父親,如果大於則交換
if a[pos] < a[child] else }}
func buildheap(a int)
}func heapsort(a int)
}func main()
heapsort(num)
fmt.println("heap sort over:", num)
}
堆排序之java實現
堆排序就是利用堆 假設利用大頂堆 進行排序的方法。它的基本思想是,將待排序的序列構造成乙個大頂堆。此時,整個序列的最大值就是堆頂的根節點。將它移走 其實就是將其與堆陣列的末尾元素交換,此時末尾元素就是最大值 然後將剩餘的 n 1 個序列重新構造成乙個堆,這樣就會得到 n 個元素中次大的值。如此反覆執...
排序演算法 之堆排序的實現
includeusing namespace std 1 找到第乙個非葉子節點的位置cur 陣列元素個數size 2 1 2 從cur開始,依次將各子樹調整為最大堆 整體成為最大堆 3 堆頂元素與陣列最後乙個元素交換 4 陣列元素減1,重複執行上述操作 void adjustup int arr,i...
排序演算法之堆排序java實現
堆排序 heap sort 的基本思想是迴圈執行如下過程直到陣列為 空 什麼是最大堆?堆是乙個具有這樣性質的順序二叉樹,每個非葉子節點的關鍵字大於等於它的孩子結點的關鍵字。顯然在乙個堆中,根節點具有最大值,而且堆中任何乙個結點的非空左 右子樹都是乙個堆,它的根節點到任一葉子的每條路徑上的節點都是遞減...