堆排序 C 實現

2021-10-02 17:51:29 字數 1958 閱讀 6365

#include

using

namespace std;

/*堆排序優勢:(二叉堆)

計算機內部:

left: i值左移一位,計算出2i;

right:i值左移一位,低位加一,計算出2i+1;

parent: i/2取下界;

#最大堆性質:除了根節點以外的所有節點i都要滿足:

a[parent(i)]≥a[i]

堆中的最大元素在根節點,堆排序演算法應用

#最小堆性質:除了根節點以外的所有節點i都要滿足:

a[parent(i)]≤a[i]

堆中的最小元素在根節點,最小堆通常用於構造優先佇列

#堆排序演算法 heapsort 就是利用最大堆的性質,將當前堆的最後乙個元素和整個堆的根節點互換

然後堆的大小減少1,對堆進行max_heapify操作,又得到乙個最大堆

最大堆根節點就是當前堆中的最大值,迴圈整個過程直到堆只剩下乙個元素。

#堆排序演算法的時間複雜度是 θ(nlgn)

*///定義父節點、左右子節點下標規律

intparent

(int i)

intleft

(int i)

intright

(int i)

//交換值函式

void

swapvalue

(int

&a,int

&b)//n是陣列a的元素數

void

max_heapify

(int

*a,int n,

int i)

}//堆排序演算法

void

heapsosrt

(int

*a,int n)

}int

main()

;int b[11]

=;for(

int i =

5;i >

0;i--

)max_heapify

(b,11

, i)

;for

(int i =

0;i <

11;i++

) cout << b[i]

<<

" ";

cout << endl;

heapsosrt

(b,11);

for(

int i =

0;i <

11;i++

) cout << b[i]

<<

" ";

cout << endl;

return0;

}/*一顆樹高為h的節點,max_heapify函式的時間複雜度是o(h)=θ(lgn)

構建乙個最大堆,觀察到,元素數為n的二叉堆的[floor(n/2)+1,n]都是葉子節點,所以只要考慮前面的作為父節點的節點是否滿足最大堆的要求

所以構建乙個二叉堆最大堆的時間複雜度是θ(nlgn)

*///基於最大堆的最大優先序列所支援的操作:

void

insert

(int

*s,int x)

;//把元素x插入到集合s中

intmaximum

(int

*s);

//返回s中具有最大鍵字的元素

intextract_max

(int

*s);

//去掉並返回s中的具有最大鍵字的元素

void

increase_key

(int

*s,int x,

int k)

;//將元素x的關鍵字值增加到k,這裡假設k的值不小於x的原關鍵字值

/* 最大優先佇列的應用:在共享計算機系統的作業排程,記錄各個作業之間的相對優先順序並完成排程。

優先佇列的所有操作的時間複雜度都是θ(lgn)

*/

c 實現堆排序

include include include using namespace std 對比枝節點和左右子節點,將比較大的節點放置於枝節點 template int heapadjust t t,int i,int size if rightchild size t rightchild t max...

C 實現堆排序

堆排序是一種具有合併排序和插入排序共同優點的排序方法。它的時間複雜度為o nlgn 它也是一種原地排序演算法 在任何時候,陣列中只有常數個元素儲存在輸入陣列以外。要介紹堆排序首先要介紹什麼是堆。1.建堆 堆資料結構是一種陣列物件,它可以被視為一顆完全二叉樹,如下圖。右邊陣列表示的堆可以用左邊的完全二...

堆排序(C 實現)

堆排序執行時間 n lgn 它是一種原地 in place 排序演算法 在任何時候,陣列中只有常數個元素儲存在陣列外。堆的資料結構不至少在堆排序中有用,還可以構成乙個有效的優先佇列。二叉堆資料結構是一種陣列物件,它可以被看做是一棵完全二叉樹。樹中的每個節點與陣列中存放該節點值的那個元素對應。除了最後...