堆排序總結

2021-10-09 20:20:59 字數 1056 閱讀 4080

演算法基於順序儲存的「完全二叉樹」:結點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...