/*6. 堆排序(heapsort)
#時間複雜度: o(nlogn);空間複雜度:o(1)
適用場合:在n個元素裡找前幾個最大的或最小的,我們用堆,並且找大的用小堆,找小的用大堆。
#分析:
1. 建堆(此例子 大根堆)
1.1 找到最後乙個父親節點,從最後乙個父親結點操作到第乙個父親節點(n/2-1 ~ 0)
調整過程:
1.1.1 看當前父親節點的左和右誰大,拿大的和父親比較:
1.1.2大: 交換,若交換的節點是父親節點,則需要調整,重複步驟2
1.2.3小:本次調整結束;
2.排序
2.1 拿堆頂(最大值)和最後乙個元素交換,完成後最後元素不參與之後調整過程;
2.2將堆頂作為被調整節點,進行調整(1.1
*)。 重複2.1
#特點: 最好和最壞時間複雜度都是 o(nlogn);
#實現方法:迴圈
*/
//調整堆(大根堆)
void heapadjust(int* pheap, int nlength, int nrootid)
if(pheap[nmaxid] > pheap[nrootid])
else
//計算下次調整根的左右位置
nleftid = 2*nrootid +1;
nrightid = 2*nrootid +2;
nmaxid = nleftid;
}}void heapsort(int* pheap, int nlength)
//2.排序
for(int i = nlength-1; i > 0 ;i--)
}
經典排序演算法 堆與堆排序(不穩定)
我們知道堆的結構是節點i的孩子為2 i和2 i 1節點,大頂堆要求父節點大於等於其2個子節點,小頂堆要求父節點小於等於其2個子節點。在乙個長為n 的序列,堆排序的過程是從第n 2開始和其子節點共3個值選擇最大 大頂堆 或者最小 小頂堆 這3個元素之間的選擇當然不會破壞穩定性。但當為n 2 1,n 2...
堆排序穩定性舉例 穩定排序和不穩定排序
這幾天筆試了好幾次了,連續碰到乙個關於常見排序演算法穩定性判別的問題,往往還是多選,對於我以及和我一樣拿不準的同學可不是乙個能輕易下結論的題目,當然如果你筆試之前已經記住了資料結構書上哪些是穩定的,哪些不是穩定的,做起來應該可以輕鬆搞定。本文是針對老是記不住這個或者想真正明白到底為什麼是穩定或者不穩...
演算法 十大排序 堆排序 大頂堆
堆排序 大頂堆 大頂堆和小頂堆的差別在與大頂堆的根節點比它的子節點和葉子節點都要大,大頂堆輸出的時候是正序的而小頂堆是逆序的 同樣的也是有兩步 1,堆化 2,下調public class 03 堆排序大頂堆 sort a for int i 0 i a.length i 進行堆化 public st...