堆排序(heap sort)就是利用堆(假設利用大堆頂)進行排序的方法。它的基本思想是,將待排序的序列構造成乙個大堆頂。此時,整個序列的最大值就是堆頂的根節點。將它移走(其實就是將其與堆陣列的末尾元素交換,此時末尾元素就是最大值),然後將剩餘的n-1個序列重新構造成乙個堆,這樣就會得到n個元素中的次大值。如此反覆執行,便能得到乙個有序序列了。
/* 對順序表l作堆排序*/
#include
#define maxsize 10
typedef
struct
sqlist;
void
swap
(sqlist *l,
int i,
int j)
/*已知l->r[s..m]中記錄的關鍵字除l->r[s]之外均滿足堆的定義*/
/*本函式調整l->r[s]的關鍵字,使l->r[s..m]成為乙個大堆頂*/
void
heapadjust
(sqlist *l,
int s,
int m)
if(temp >= l->r[j]
) l->r[s]
= l->r[j]
; s = j;
} l->r[s]
= temp;
//插入
}void
heapsort
(sqlist *l)
for(i = l->length; i >
1; i--
)//將每個最大值的根結點與末尾元素交換,再次調整其成為大堆頂
}int
main()
heapsort
(&h)
;for
(int i =
1; i < n; i++)}
/*程式執行示例:
堆排序的效率到底有多高呢?它的執行時間主要是消耗在初始構建堆和在重建時的反覆篩選上。在構建堆的過程中,因為我們是完全二叉樹從最下層最右邊的非終端節點開始構建,將它與其孩子進行比較和若有必要的交換,對於每個非終端節點來說,其實最多進行兩次比較和互換操作。因此真個構建堆的時間複雜度為o(n).
總體來說,堆的時間複雜度為o(nlo
gnnlogn
nlog
n)。由於堆排序對原始記錄的排序狀態並不敏感,因此,它無論最好、最壞和平均時間複雜度均為o(nlo
gnnlogn
nlog
n)。這在效能上顯然要遠遠好於冒泡、簡單選擇、直接插入的o(n
2n^2
n2)的時間複雜度了。
空間複雜度上,它只有乙個用來交換的暫存單元,也非常的不錯。不過由於記錄的比較與交換是跳躍式進行,因此堆排序也是一種不穩定的排序方法。
排序演算法 選擇排序 簡單排序 堆排序
1 介紹。在簡單選擇排序過程中,所需移動記錄的次數比較少。最好情況下,即待排序記錄初始狀態就已經是正序排列了,則不需要移動記錄。最壞情況下,即待排序記錄初始狀態是按第一條記錄最小,之後的記錄從小到大順序排列,則需要移動記錄的次數最多為3 n 1 簡單選擇排序過程中需要進行的比較次數與初始狀態下待排序...
選擇排序演算法 堆排序
選擇排序演算法 堆排序 堆排序的結構思想就是 先構建 例如大頂堆 然後調整。構建堆,在構建過程中,用到3個變數,root,last,child,其中有兩步 比較左右孩子大小,然後將大的值與root比較並且 是否 交換位置。另外,構建完成之後,接著迴圈將最後乙個元素與第乙個元素交換位置,然後接著從第乙...
選擇排序 簡單選擇排序 堆排序
一 簡單選擇排序 對於n個數要進行n次排序,第一次,將最小的數放在第乙個。第二次,將第二小的樹,放在第二個。每次都和後面的數做比較,如果是從小到大的排序,當當前的數字比後面的大時,要進行交換。include void chosesort int a,int length void main int ...