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