第一篇: 堆排序
二叉堆滿足二個特性:
1).父結點的鍵值總是大於或等於(小於或等於)任何乙個子節點的鍵值。
2).每個結點的左子樹和右子樹都是乙個二叉堆(都是最大堆或最小堆)。
堆排序的三個要點
從小到大排序,要先建立最大堆。
以構建最大堆為例
1.堆調整
以待排序節點開始,遍歷子節點,把兩個子節點值比較大的子節點向上移動。
兩個子節點都比該節點小,說明不用在調節了。注意,要保證這個步驟成立,本次堆調整時,子節點都是二叉堆。
當然了,葉子節點一定是二叉堆(因為沒有子節點)。
還要注意一點是,一次調節交換可能會破壞子節點的有序性,所以每次調節都要調整到二叉樹葉節點位置(當然,也可以是兩個子節點都比該節點小時)。
2.構建堆
構建堆就是構建乙個根節點位置開始的二叉堆。所以要先保證它的子節點也是二叉堆。
void makeminheap(int a, int n)
注意,構建的二叉堆的陣列元素還不是排好順序的,因為不能保證左子樹和右子樹的順序。
3.二叉堆排序
二叉堆的根節點一定是最大的,將它換到陣列末尾不再移動,將資料末尾的節點換到根節點,重新調整二叉堆。
重複這個過程,直到資料全部移動到二叉堆的後面。
for (int i = n; i > 1; i--)
快速排序的演算法優化要點
理論上快速排序的平均時間複雜度是nlgn.最差是n 2.但實際實現中可能表現的不如插入排序等其他演算法。筆者參考stl的實現總結了三個對快速排序優化的要點。1 標值的選取。stl庫中採用三點中值的方面,增加了合理選取標值的概率。2 排序序列小於16時候採用插入排序。這個是可以證明的,在小資料量的時候...
歸併排序演算法及其記憶要點
歸併排序這個演算法,讓我回憶到一道演算法題目,就是兩個有序的陣列合併成乙個有序的陣列,相信經常刷題的同學一定很熟悉這個題目。實際上歸併排序就是把陣列拆分成乙個乙個的元素,然後兩兩都是有序陣列,再進行合併。這裡要說明的是,大話資料結構這本書中的歸併排序 遞迴版 的 我不是很推薦,相對而言較為複雜一點,...
演算法知識要點
非遞迴的題目 二叉樹的前序 中序 後序,全排列,全子集 佇列一定要掌握好,寬度優先搜尋也是很基礎的東西 平衡二叉搜尋樹,只需要知道他的定義和結構是什麼,有什麼樣的特性,可以支援增刪改操作,不需要細究其增刪改方法如何實現。記憶化搜尋,即動態規劃是一種思想,幹的事情是 否決掉了中間重複計算的狀態,如果遇...