演算法基於順序儲存的「完全二叉樹」:結點i的左孩子是2i;右孩子是2i+1;父節點是i/2;編號小於n/2的結點都是分支結點。
大根堆(根》=左、右),小根堆(根<=左、右)
建堆:編號<=n/2的所有結點依次」下墜「調整(自底向上處理分支結點),調整規則:小元素逐層」下墜「(與關鍵字更大的孩子交換)。
排序:將棧頂元素加入有序子串行(棧頂元素與棧底元素交換),棧底元素換到棧頂後,需要進行」下墜「調整,恢復」大根堆「的特性;重複上述重複n-1趟。
//第一部分:排序演算法
//9-7 堆排序(以大根堆為例)
void
buildmaxheap
(int a,
int len)
void
headadjust
(int a,
int k,
int len)
} a[k]
=a[0];
//下墜結束條件:1.迴圈到了葉子結點;2.分支結點大於左右孩子結點
}//基於大根堆進行排序
void
swap
(int
*x,int
*y)void
heapsort
(int a,
int len)
}//小根堆的插入操作
void
insertheap
(int a,
int len,
int num)
//num表示需要插入到小根堆的數值
} a[k]
=a[0];
}//小根堆的刪除操作
void
deleteheap
(int a,
int len,
int index)
3.效能分析
空間複雜度:o(1)
時間複雜度:建堆:o(n),排序:o(nlog2n);總的時間複雜度:o(nlog2n);
穩定性:不穩定
基於大根堆的堆排序得到」遞增序列「,基於小根堆的堆排序得到」遞減序列「。
排序總結 堆排序
created by liyuanshuo on 2017 3 17.include heap sort.h 堆的定義 kik 2i k i k 2i 1 若以一維陣列儲存堆,則堆對應乙個完全二叉樹,並且所有的非葉節點的值均不大於 或者不小於 其子女的值 根節點 堆頂元素 的值是最小的 或者最大的 ...
堆排序總結
在面試中遇到要你手寫堆排序,可以先詢問是否可以使用stl中建堆的演算法,問清楚面試官的意圖之後方可動手寫 交流最重要。heap並不屬於stl元件,是乙個幕後英雄,stl實現了最大堆,預設的元素比較方式是less,如果要使用小根堆,則將比較方式設定為greater,並用來作為priority queu...
堆排序總結
堆 孩子節點總是小於 或大於 父節點的完全二叉樹 時間複雜度 o nlogn 步驟 建立堆 從完全二叉樹最後乙個內部節點向前執行堆調整 交換堆首位,堆尺寸 1 對新堆的堆首執行堆調整 重複執行第三步直到堆尺寸為0 初始化資料 var numbers for var i 0 i 20 i consol...