時間複雜度:最好 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+2]
大根堆:每個結點元素的值都大於等於其子節點元素的值的堆。
s[i]>=s[2*i+1] && s[i]>=s[2*i+2]
堆頂: 序列中第乙個元素s[0],為序列中最小值(小根堆)或最大值(大根堆)。
左子節點:s[2*i+1]
右子節點:s[2*i+2]
父節點: s[(i-1)/2]
如下圖,有乙個陣列s[9,6,7,3,1,4]即為乙個大根堆。其堆頂為s[0]=9。
從最後乙個非葉節點開始上調整,將最較大的值往上頂。
例:[9,1,5,3,8,7,2,4,6,0]
將待排序序列調整大根堆。
交換堆頂和末尾元素,將堆頂元素(即最大值)丟擲,將剩餘序列繼續步驟1,直到剩餘序列大小為零。
例:[9,1,5,3,8,7,2,4,6,0]
**參考自chimomo
///
/// 堆排序 c#
///
public
static
void
heapsort(int s)
// 每一遍迴圈將堆頂元素(即最大值)丟擲到陣列末尾,然後堆大小減一,從新建堆
for (int i = s.length - 1; i > 0; i--)
}///
/// 將指定的結點調整為堆
///
private
static
void
heapadjust(int s, int i, int heapsize)
// 比較右子結點
if (right < heapsize && s[right] > s[large])
// 如有子結點大於自身就交換,使大的元素上移
// 並遞迴該子節點,以保證堆的性質
if (i != large)
}
def
heap_sort
(s):
#python
for i in range(len(s)//2-1, -1, -1):
heap_adjust(s, i, len(s))
for i in range(len(s)-1, 0, -1):
s[0], s[i] = s[i], s[0]
heap_adjust(s, 0, i)
defheap_adjust
(s, i, size):
left = 2 * i + 1
right = left + 1
large = i
if left < size and s[left] > s[large]:
large = left
if right < size and s[right] > s[large]:
large = right
if i != large:
s[i], s[large] = s[large], s[i]
heap_adjust(s, large, size)
排序演算法 七 堆排序
1.1 什麼是堆 要理解堆排序,首先要先理解什麼是堆。堆是一顆順序儲存的完全二叉樹,堆又分為最大堆和最小堆。根據上面的描述我們可以用乙個數學描述來定義最大最小堆 對於陣列 d 0 d 1 d n 當且僅當滿足下列關係時稱之為堆 舉個栗子 3,4,7,12,15,18 就是乙個典型的最小堆,i 2。1...
七 堆排序(Heap Sort)
堆排序是一種樹形選擇排序方法,它的特點是 在排序的過程中,將array 0,n 1 看成是一顆完全二叉樹的順序儲存結構,利用完全二叉樹中雙親節點和孩子結點之間的內在關係,在當前無序區中選擇關鍵字最大 最小 的元素。若array 0,n 1 表示一顆完全二叉樹的順序儲存模式,則雙親節點指標和孩子結點指...
七 堆排序 HeapSort
基本思想 圖示 88,85,83,73,72,60,57,48,42,6 heap sort 平均時間複雜度 o nlogn 由於每次重新恢復堆的時間複雜度為o logn 共n 1次重新恢復堆操作,再加上前面建立堆時n 2次向下調整,每次調整時間複雜度也為o logn 二次操作時間相加還是o n l...