堆排序的詳細講解及實現

2022-09-23 16:09:10 字數 2036 閱讀 3016

堆排序: 特點

堆排序(heapsort)是一樹形選擇排序。堆排序的特點是:在排序過程中,將r[l..n]看成是一棵完全二叉樹的順序儲存結構,

利用完全二叉樹中雙親結點和孩子結點之間的內在關係(參見二叉樹的順序儲存結構),在當前無序區中選擇關鍵字最大(或最小)的記錄

堆排序與直接選擇排序的區別直接選擇排序中,為了從r[1..n]中選出關鍵字最小的記錄,必須進行n-1次比較,然後在r[2..n]中選出關鍵字

最小的記錄,又需要做n-2次比較。事實上,後面的n-2次比較中,有許多比較可能在前面的n-1次比較中已經做過,但由於前一趟排序時未保留

這些比較結果,所以後一趟排序時又重複執行了這些比較操作。  

注:堆排序可通過樹形結構儲存部分比較結果,可減少比較次數。

演算法分析

堆排序的時間,主要由建立初始堆和反覆重建堆這兩部分的時間開銷構成,它們均是通過呼叫heap實現的。

堆排序的最壞時間複雜度為o(nlogn)。堆序的平均效能較接近於最壞效能。

由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。

堆排序是就地排序,輔助空間為o(1),

它是不穩定的排序方法。

實在如下:/*

filename:myheapsort.cpp

author: xiaobing

e-mail: [email protected]

date: 2013-08-27

*/#include

#include

#include

#include

#define n 10

using namespace std;

void swap(int *a, int *b)

/* 堆排序實現

n個關鍵字序列kl,k2,…,kn稱為(heap),當且僅當該序列滿足如下性質(簡稱為堆性質):

(1)ki<=k(2i)且ki<=k(2i+1)(1≤i≤ n),當然,這是小根堆,=號。

k(i)相當於二叉樹的非葉結點,k(2i)則是左孩子,k(2i+1)是右孩子

若將此序列所儲存的向量r[1..n]看做是一棵完全二叉樹的儲存結構,則堆實質上是滿足如下性質的完全二叉樹:

樹中任一非葉結點的關鍵字均不大於(或不小於)其左右孩子(若存在)結點的關鍵字。

實現原理:

1。開始時,需將陣列建立為乙個堆,使得其滿足所有的非葉節點的值都大於等於(或小於等於)其左右

孩子節點的值,這樣的效果使得第乙個節點,即根節點總是最大的元素。

2.從最後乙個陣列元素開始與陣列第乙個元素交換資料,交換一次後,再創新建立堆,但堆的長度減1,直到

陣列長度變為1為止,這樣就排序完成

注:使得每個非葉節點的值都大於等左右孩子節點的值,是實現由小到大排序

相反,是實現由大到小排序。

*//*

*@prama arr 待排序的陣列

@prama i 待開始調整的位置

@prama length 調整的範圍,當然,開始時是陣列長度,但後面會越來越小直到為1

* */

void heapadjust(int arr, int i, int length)

//如果孩子節點比父節點大,因為剛才已經確定了arr[child]是左右孩子中的大著

//更新父節點為大值

if(arr[child] > temp) else

//若更新後,則交換值,若沒有更新,則已經退出了,不能執行到此

arr[child] = temp; }}

/* @prama arr 待排序的陣列

@prama length 陣列的長度

*/void heapsort(int arr, int length)

//實現第二步

/* *這裡是從最後元素開始調整,不斷縮小範圍,直到第乙個元素為止

*/for(i = length - 1;i > 0;i--)

}void print(int arr, int n){

int i;

for(i = 0; i < n;i++){

cout<

堆排序的講解和實現

堆排序 特點堆排序 heapsort 是一樹形選擇排序。堆排序的特點是 在排序過程中,將r l.n 看成是一棵完全二叉樹的順序儲存結構,利用完全二叉樹中雙親結點和孩子結點之間的內在關係 參見二叉樹的順序儲存結構 在當前無序區中選擇關鍵字最大 或最小 的記錄 堆排序與直接選擇排序的區別直接選擇排序中,...

堆排序演算法講解 及python3實現

將初始待排序關鍵字序列 r1,r2.rn 構建成大頂堆,此堆為初始的無序區 將堆頂元素r 1 與最後乙個元素r n 交換,此時得到新的無序區 r1,r2,rn 1 和新的有序區 rn 由於交換後新的堆頂r 1 可能違反堆的性質,因此需要對當前無序區 r1,r2,rn 1 調整為新堆,然後再次將r 1...

堆排序 heap sort 演算法講解與實現

開始時,堆不可能是這個樣子,因為,將陣列轉化為樹,是有規則的,必須把左邊填滿才能再填右邊。待排序陣列 a 46,30,82,90,56,17,95 組成乙個二叉樹,將46,30,82,90,56,17,95這幾個數字從儲存在陣列結構,轉變到二叉樹及結構,是通過為一些陣列下標賦予一些新的關係。比如,在...