C 實現堆排序

2021-08-26 02:17:04 字數 1242 閱讀 9829

堆的定義:

堆(英語:heap)是電腦科學中一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質:

1.堆中某個節點的值總是不大於或不小於其父節點的值;

2.堆總是一棵完全二叉樹。

將根節點最大的堆叫做最大堆或大根堆或大頂堆,根節點最小的堆叫做最小堆或小根堆或者小頂堆。常見的堆有二叉堆、斐波那契堆等。

堆的定義如下:n個元素的序列當且僅當滿足下關係時,稱之為堆。

(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4…n/2)

若將和此次序列對應的一維陣列(即以一維陣列作此序列的儲存結構)看成是乙個完全二叉樹,則堆的含義表明,完全二叉樹中所有非終端結點的值均不大於(或不小於)其左、右孩子結點的值。由此,若序列是堆,則堆頂元素(或完全二叉樹的根)必為序列中n個元素的最小值(或最大值)。

如果將大頂堆或者小頂堆用層序遍歷存入陣列,則一定滿足堆定義的關係表示式。

堆排序的基本思想:

將待排序的序列構造成乙個大頂堆。此時,整個序列的最大值就是堆頂的跟結點。將它移走(其實就是將其與堆陣列的末尾元素交換,此時末尾元素就是最大值),然後將剩餘的n−

1 n−1

個序列重新構造層成乙個堆,這樣就會得到

n n

個元素中的次大值。如此反覆執行,便能夠得到乙個有序序列。

堆排序的**實現:

#include

using namespace std;

void showarr(int arr, int

length)

void swap(int arr, int i, int j)

void headadjust(int arr, int

index, int

length)

}void headsort(int arr, int

length)

}int main()

; int

length = sizeof(arr) / sizeof(int);

showarr(arr, length);

headsort(arr, length);

showarr(arr, length);

system("pause");

return

0;}

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