堆排序(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 ...