演算法導論之排序和順序統計學

2021-07-12 07:30:53 字數 2233 閱讀 2056

排序:對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 ...