排序演算法之七 堆排序 Heap Sort

2021-09-08 20:25:34 字數 1499 閱讀 5975

堆排序(heapsort)是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質:即子結點的鍵值或索引總是小於(或者大於)它的父節點。

將待排序的元素序列(r1,r2….rn)構建成最大堆,此堆為初始的無序區。(關於最大堆的詳細構建過程請點這裡)

將最大堆的堆頂元素r1(當前堆樹中的最大值)與最後乙個元素rn交換。此時得到新的無序區(r1,r2,……rn-1)和新的有序區(rn),且滿足r[1,2…n-1]<=r[n];

由於交換後新的堆頂r1可能違反了最大堆的性質,因此需要對當前無序區(r1,r2,……rn-1)重新調整為最大堆,然後再次將r1與無序區最後乙個元素交換,得到新的無序區(r1,r2,……rn-2)和有序區(rn-1,rn)。不斷重複此過程直到無序區的元素個數為1;

堆排序是不穩定的排序演算法,不穩定發生在堆頂元素與a[i]交換的時刻。

比如序列:,堆頂元素是10,堆排序下一步將10和第二個4進行交換,得到序列 ,再進行堆調整得到,重複之前的操作最後得到從而改變了兩個4的相對次序。

堆排序c/c++**:

void

swap

(int arr,

int i,

int j)

/*** 將父節點為aar[i]的子樹調整為最大堆

* @param arr 堆陣列

* @param size 堆陣列長度

* @param i 節點索引

*/void

adjustheap

(int arr,

int size,

int i)

if(right_child < size && arr[right_child]

> arr[max])if

(max != i)

}/**

* 根據輸入的陣列構建乙個最大堆

* @param arr 堆陣列

* @param size 堆陣列長度

* @return 堆陣列長度

*/int

buildmaxheap

(int arr,

int size)

return size;

}/**

* 堆排序

* 最差時間複雜度 o(nlogn)

* 最優時間複雜度 o(nlogn)

* 平均時間複雜度 o(nlogn)

* 空間複雜度 o(1)

* 穩定性 不穩定

* @param arr 陣列

* @param size 長度

*/void

heapsort

(int arr,

int size)

}

元素序列的堆排序流程示意圖如下:

堆排序後的輸出的元素序列為:

排序演算法 七 堆排序

1.1 什麼是堆 要理解堆排序,首先要先理解什麼是堆。堆是一顆順序儲存的完全二叉樹,堆又分為最大堆和最小堆。根據上面的描述我們可以用乙個數學描述來定義最大最小堆 對於陣列 d 0 d 1 d n 當且僅當滿足下列關係時稱之為堆 舉個栗子 3,4,7,12,15,18 就是乙個典型的最小堆,i 2。1...

基本排序演算法 之七 堆排序

首先放遞迴的版本,因為遞迴版本更容易理解過程。堆排序實際是把數列看成一顆完全二叉樹,而不是真的去用 指標結構體 構造一顆二叉樹。數列在堆中從上到下,從左至右依次排成一棵樹。下面是遞迴版本的 用來調整節點,保證節點大於左右孩子 templatevoid adjustnode t arr,int nod...

排序七 堆排序

時間複雜度 最好 o n o n 平均o n o nlogn 最差o n o nlogn 空間複雜度 o n o 1 穩定性 不穩定 堆 順序儲存的完全二叉樹,其每個結點均小於等於或大於等於其子節點。小根堆 每個結點元素的值都小於等於其子節點元素的值的堆。s i s 2 i 1 s i s 2 i ...