堆排序是一種樹形選擇排序方法,它的特點是:在排序的過程中,將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設定成為全域...