C 的資料結構與演算法學習 五 堆與堆排序

2021-09-23 17:02:17 字數 3101 閱讀 3058

堆排序與快速排序,歸併排序一樣都是時間複雜度為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 這裡來說明一下滿二叉樹的概念與完全二叉樹的概念。滿二叉樹 除了葉子節點,所有的節點的左右孩子都不為空,就是一棵滿二叉樹,如下圖。可以看出 滿二叉樹所有的節點都擁有左孩子,又擁有右...