資料結構經典演算法之五 堆排序

2021-09-22 18:43:15 字數 1192 閱讀 3399

堆排序

基本思想:減治演算法。通過堆來選擇資料,其中排公升序建大堆,排降序建小堆

首先,在這裡簡單介紹一下二叉堆的概念:二叉堆在邏輯上可視為完全二叉樹,在物理上可視為陣列,本質上是對於任意乙個結點,要求根的值 >=(針對大堆) 所有的子樹結點的值,其基本作用是找最值

堆排序主要分為以下三部分:

1.向下調整

2.建堆

3.堆排序

**實現:

1.建堆

void

createheap

(int

array)

}

2.向下調整 / 堆化

void

heapify1

(int

array ,

int size ,

int index)

while(2

+ index +

1< size)

//3.比較雙親的值和最大孩子的值,如果雙親大,停止;否則交換兩者的值,並以新結點開始繼續向下調整

if(array[max]

> array[index]

)else}}

void

heapify2

(int

array ,

int index)

//2.找最大孩子

if(right < array.length && array[right]

> array[left]

)//3.比較雙親和孩子結點

if(array[index]

>= array[max]

)//孩子大,交換

swap

(array , index , max)

;//4.繼續向下調整

heapify1

(array , max)

;}

3.堆排序

void

heapsort

(int

array)

}

堆排序特性總結:

堆排序使用堆來找最值,效率較高

排公升序建大堆,排降序建小堆

時間複雜度:最好、最壞、平均都是o(n*log(n))

空間複雜度:o(1)

穩定性:不穩定

資料結構 五 堆排序

1 演算法流程 1 對原始資料構建大根堆 a 從下至上,遍歷每個非葉子父節點,保證每個非葉子父節點都比它的左右子節點來的大,非葉子父節點的對應索引範圍為 0,n 2 1 b 在遍歷每個非葉子父節點的時候,如果發生該節點交換 下沉 那麼要遞迴下去 2 交換大根堆構建後的陣列的首個元素與末尾元素,這時候...

資料結構之排序(六) 堆排序

堆是具有下列性質的完全二叉樹 每個結點的值都大於或等於其左右孩子結點的值,稱為大頂堆,如左圖 或者每個結點的值都小於或等於其左右孩子結點的值,稱為小頂堆,如右圖。堆排序 heap sort 就是利用堆 假設利用大頂堆 進行排序的方法。它的基本思想是,將帶排序的序列構造成乙個大頂堆。此時,整個序列的最...

資料結構經典排序 堆排序

堆排序思想 以大頂堆為例 1 先建初始堆,從第乙個非葉子節點開始調整堆為乙個大頂堆,直到整個待排序列成為乙個大頂堆 2 將堆頂元素與堆中的最後乙個元素交換 3 將堆中的最後乙個元素移除堆 4 再次調整待排序列為乙個大頂堆,從堆中的根節點開始比較,比較該節點的左右子節點,將較大的節點值與根節點的值比較...