排序:對n個數的序列重排過程。待排序的數,一般是選擇記錄中資料集的關鍵字key作為排序的值,而資料集中其他資料(稱為:衛星資料)以key為中心移動。實際上,對於排序過程中,key的移動和交換,衛星資料並不定跟著,只要記錄的指標隨key交換即可,將資料移動量減小到最小。
關鍵字和衛星資料所構成的資料集,在實際排序應用中,不單只關注關鍵字序列,還關心衛星資料的儲存結構,在選用具體排序演算法中有一定考量。排序演算法分為:
1)比較排序:插入排序、合併排序、堆排序、快速排序,對陣列中的元素進行比較來實現排序;
2)非比較排序:計數排序、基數排序,利用非比較的其他方法來獲得陣列的排序資訊;
每種排序演算法都要考量其執行時間和儲存空間的效能,各有其應用優點。插入排序的最壞情況執行時
1)maximum(s),返回s中最大關鍵字的元素,在最大堆a中返回根節點即可,演算法如下:
fun_heap_maximum(a){
return a[1];
2)extract_max(s),去掉並返回s中最大關鍵字的元素,在最大堆a中去掉最大值後需要重新調整保持最大堆性質,演算法如下:
fun_heap_extractmax(a){
max=a[1];//返回最大值
a[1]=a[heapsize[a]];//將最後乙個節點的值,交換到第乙個節點
heapsize[a]= heapsize[a]-1;//堆大小減1
fun_max_heapify(a,1);//保持最大堆性質函式
return max;
fun_max_heapify(a,i){
l=left(i);
r=right(i);
if l<=heapsize[a] and a[l]>a[i]
then largest=l
else largest=i
if r<=heapsize[a] and a[r]>a[largest]
then largest=r
if largest ≠ i
then exchange(a[i],a[largest])
fun_max_heapify(a,largest)
3)increasekey(s,x,k),將元素x的關鍵字的值增加到k,在最大堆a中操作就是賦值x元素的新關鍵字值,並保持堆性質,演算法如下:
fun_heap_increasekey(a,i,key){
a[i]=key;//賦值key
while i>1 and a[parent(i)]do exchange(a[i],a[parent(i)]
i=parent[i]
4)insert(s,x),新增元素x到集合s,即是插入乙個元素關鍵字key到乙個已建成的最大堆a中,插入演算法如下:
fun_maxheap_insert(a,key){
heapsize[a]=heapsize[a]+1;//堆大小加1
a[heapsize[a]]=-∞;//新增葉節點,關鍵值為負無窮大
fun_heap_increasekey(a, heapsize[a],key);//新增葉子節點插入的值,可按照increasekey來操作
最小優先順序佇列支援的操作類似,應用最小堆,用在基於事件驅動的模擬器中。
排序和順序統計學(演算法導論)
1.堆排序 堆資料結構是一種陣列物件,它可以被視為一顆完全二叉樹。存放時利用了二叉樹,父親節點序號 i 子節點序號 2 i,2 i 1 的性質 堆的建立,調整,輸出例項如下 include include includeusing namespace std root從data 1 開始存起 我想到...
排序和順序統計學 2 快速排序
快排我接觸的也比較多了,從之前noip的時候演算法老師講的版本,到之前資料結構課上學習的版本,到現在 演算法導論 裡講的版本,我個人並不能不能區別它們的好壞,權且都寫出來,以後再來區別。三種實現方式如下 noip void qsort1 int a,int l,int r if l資料結構 int ...
排序和順序統計量(演算法導論)
人一生別太狂,指不定誰輝煌 總結排序演算法的執行時間 演算法最壞執行時間 平均期望執行時間 是否是原址排序 插入排序o n2 o n2 是 歸併排序o nlgn o nlgn 否 堆排序o n lgn 是快速排序o n2 o nlgn 期望 是 計數排序o k n o k n 否基數排序o d k ...