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