排序七 堆排序

2021-08-13 11:16:14 字數 2094 閱讀 2743

時間複雜度:最好 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...