堆排序與快速排序,歸併排序一樣都是時間複雜度為o(n
logn
)o_(nlogn)
o(nlo
gn)的幾種高階排序方法。學習堆排序前,先介紹一下資料結構中的二叉堆(binaryheap)。
1.父結點的鍵值總是大於或等於任何乙個子節點的鍵值。2.每個結點的左子樹和右子樹都是乙個二叉堆(都是最大堆)。
堆的操作:入隊(shift up)堆的操作:出隊(shift down)
下面先給出《資料結構c++語言描述》中最小堆的建立插入刪除的**
// 建構函式, 構造乙個空堆, 可容納capacity個元素
maxheap(int capacity)
// heapify,建構函式, 通過乙個給定陣列建立乙個最大堆
// 該構造堆的過程, 時間複雜度為o(n)
maxheap(item arr, int n)
~maxheap()
// 返回堆中的元素個數
int size()
// 返回乙個布林值, 表示堆中是否為空
bool isempty()
// 像最大堆中插入乙個新的元素 item
void insert(item item)
// 從最大堆中取出堆頂元素, 即堆中所儲存的最大資料
item extractmax()
public:
// 以樹狀列印整個堆結構
void testprint()
// 我們的testprint只能處理整數資訊
if( typeid(item) != typeid(int) )
cout<
cout<0 )
int max_level_number = int(pow(2, max_level-1));
int cur_tree_max_level_number = max_level_number;
int index = 1;
for( int level = 0 ; level < max_level ; level ++ )
cout<= 10 )
else
}void putbranchinline( string &line, int index_cur_level, int cur_tree_width)
};
/ heapsort1, 將所有的元素依次新增到堆中, 在將所有元素從堆中依次取出來, 即完成了排序
// 無論是建立堆的過程, 還是從堆中依次取出元素的過程, 時間複雜度均為o(nlogn)
// 整個堆排序的整體時間複雜度為o(nlogn)
templatevoid heapsort1(t arr, int n)
// heapsort2, 借助我們的heapify過程建立堆
// 此時, 建立堆的過程時間複雜度為o(n), 將所有元素依次從堆中取出來, 實踐複雜度為o(nlogn)
// 堆排序的總體時間複雜度依然是o(nlogn), 但是比上述heapsort1效能更優, 因為建立堆的效能更優
templatevoid heapsort2(t arr, int n)
// 測試 maxheap
int main()
maxheap.testprint();
int n = 1000000;
// 測試1 一般性測試
cout<
int* arr1 = sorttesthelper::generaterandomarray(n,0,n);
int* arr2 = sorttesthelper::copyintarray(arr1, n);
sorttesthelper::testsort("heap sort 1", heapsort1, arr1, n);
sorttesthelper::testsort("heap sort 2", heapsort2, arr2, n);
delete arr1;
delete arr2;
cout<
// 測試2 測試近乎有序的陣列
int swaptimes = 100;
cout<
arr1 = sorttesthelper::generatenearlyorderedarray(n,swaptimes);
arr2 = sorttesthelper::copyintarray(arr1, n);
sorttesthelper::testsort("heap sort 1", heapsort1, arr1, n);
sorttesthelper::testsort("heap sort 2", heapsort2, arr2, n);
delete arr1;
delete arr2;
cout<
// 測試3 測試存在包含大量相同元素的陣列
cout<
arr1 = sorttesthelper::generaterandomarray(n,0,10);
arr2 = sorttesthelper::copyintarray(arr1, n);
sorttesthelper::testsort("heap sort 1", heapsort1, arr1, n);
sorttesthelper::testsort("heap sort 2", heapsort2, arr2, n);
delete arr1;
delete arr2;
return 0;
}
資料結構與演算法 堆
堆 完全二叉樹,高度為o lgn 基本操作至多和樹的高度成正比,構建堆的時間複雜度是o n 堆是一顆完全二叉樹,假設有n個節點,樹高h log2 n 證明方法如下 1 假設根節點的高度為0,葉子節點高度為h,每層包含元素個數為2 x,x 從0 到h。2 構建堆的過程是自下而上,對於每層非葉子節點需要...
資料結構與演算法 堆
在 演算法設計技巧與分析 這本書的第四章,介紹了堆。於是按照上面的偽 實現了一下。資料結構定義maxheap.hpp如下,1 ifndef max heap hpp 2 define max heap hpp 34 include 5using std vector 67 class maxheap...
資料結構與演算法 堆
堆的乙個經典的實現是完全二叉樹 complete binary tree 這樣實現的堆稱為二叉堆 binary heap 這裡來說明一下滿二叉樹的概念與完全二叉樹的概念。滿二叉樹 除了葉子節點,所有的節點的左右孩子都不為空,就是一棵滿二叉樹,如下圖。可以看出 滿二叉樹所有的節點都擁有左孩子,又擁有右...