七 堆排序(Heap Sort)

2021-09-17 03:48:02 字數 2460 閱讀 6744

堆排序是一種樹形選擇排序方法,它的特點是:在排序的過程中,將array[0,…,n-1]看成是一顆完全二叉樹的順序儲存結構,利用完全二叉樹中雙親節點和孩子結點之間的內在關係,在當前無序區中選擇關鍵字最大(最小)的元素。

若array[0,…,n-1]表示一顆完全二叉樹的順序儲存模式,則雙親節點指標和孩子結點指標之間的內在關係如下:

堆的定義:n個關鍵字序列array[0,…,n-1],當且僅當滿足下列要求:(0 <= i <= (n-1)/2)

建立大根堆:

堆排序:(大根堆)

空間複雜度:o(1);

時間複雜度:建堆:o(n),每次調整o(log n),故最好、最壞、平均情況下:o(n*logn);

穩定性:不穩定

//構建大根堆:將array看成完全二叉樹的順序儲存結構

private

int[

]buildmaxheap

(int

array)

return array;

}//將元素array[k]自下往上逐步調整樹形結構

private

void

adjustdowntoup

(int

array,

int k,

int length)

if(temp>=array[i]

)else

} array[k]

= temp;

//被調整的結點的值放人最終位置

}

//堆排序

public

int[

]heapsort

(int

array)

return array;

}

先將堆的最後乙個元素與堆頂元素交換,由於此時堆的性質被破壞,需對此時的根節點進行向下調整操作。

//刪除堆頂元素操作

public

int[

]deletemax

(int

array)

對堆的插入操作:先將新節點放在堆的末端,再對這個新節點執行向上調整操作。

假設陣列的最後乙個元素array[array.length-1]為空,新插入的結點初始時放置在此處。

//插入操作:向大根堆array中插入資料data

public

int[

]insertdata

(int

array,

int data)

else

} array[k]

= data;

//將插入的結點放到正確的位置

return array;

}

public

void

tostring

(int

array)

}public

static

void

main

(string args)

; system.out.

print

("構建大根堆:");

hs.tostring

(hs.

buildmaxheap

(array));

system.out.

print

("\n"

+"刪除堆頂元素:");

hs.tostring

(hs.

deletemax

(array));

system.out.

print

("\n"

+"插入元素63:");

hs.tostring

(hs.

insertdata

(array,63)

);system.out.

print

("\n"

+"大根堆排序:");

hs.tostring

(hs.

heapsort

(array));

}

構建大根堆:122

8778

4517

6553

932

刪除堆頂元素:87

4578

3217

65539-

99999

插入元素63:87

6378

4517

6553

932

大根堆排序:9

1732

4553

6365

7887

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

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

堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。將待排序的元素序列 r1,r2 rn 構建成最大堆,此堆為初始的無序區。關於最大堆的詳細構建過程請點這裡 將最大堆的堆頂元...

排序演算法 7 堆排序(Heap Sort)

堆排序 heapsort 是指利用堆這種資料結構所設計的一種排序演算法。堆積是乙個近似完全二叉樹的結構,並同時滿足堆積的性質 即子結點的鍵值或索引總是小於 或者大於 它的父節點。7.1 演算法描述 7.2 演示 7.3 實現 var len 因為宣告的多個函式都需要資料長度,所以把len設定成為全域...