三種改良排序(希爾排序,堆排序,快速排序)

2021-10-08 16:03:30 字數 2829 閱讀 1436

一:改良的直接插入排序(希爾排序)

優化考慮:因為直接插入排序對於大致有順序的數列效率較高,希爾排序即將數列先進行一定排序

希爾:

for

(step = count/

2; step; step /=2)

}

一次:

for

(i = start + step; i < count; i += step)

for(t = i; t > j; t -= step)

data[j]

= tmp;

}

原理:希爾排序對於初始n個元素的數列,第一輪以n/2為步長(即0, n/2兩個資料),將兩個資料進行直接插入排序;

第二輪以n / 2 ^ 2為步長,進行直接插入排序

即將一長串數列按固定間距劃分成幾個資料塊,在資料塊中進行直接插入排序。

二:改良的選擇排序(堆排序)

基於二叉樹;

公升序(大根堆):每乙個非葉子節點值都大於其子節點

二叉樹一些計算:

①最大非葉子節點編號:n / 2 - 1

②編號為t的節點,其左孩子編號:t * 2 + 1

堆排序首先將數列表示成乙個完全二叉樹(即最多有乙個只有左孩子的節點,切最後乙個節點刪除,不影響前面序號的連續性)

將這個二叉樹都調整為大根堆(即將非葉子節點和左孩子右孩子值作比較,最大的放到非葉子節點上)

調整後根節點就是值最大的節點,最後乙個節點是值最小的節點,將根節點和最後乙個節點值交換,最後乙個節點上的值即為最大值,

再進行大根堆調整,但此時二叉樹的資料個數要減一(因為最後乙個節點已經排序好了)

void

adjustheap

(int

*data,

int count,

int root)

tmp = data[root]

; data[root]

= data[maxnode]

; data[maxnode]

= tmp;

root = maxnode;}}

void

heapsort

(int

*data,

int count)

while

(count)

}

首先拿到二叉樹,取出最後乙個非葉子節點,計算它的左右孩子下標,將該左右子樹調整為大根堆,

最後乙個左右子樹調整好後,再取上乙個左右子樹進行調整,直到取到根節點並調整完,即整個樹都調整完畢

調整完後就將①取根節點數,②和最後乙個節點交換,③總節點數-1,④在進行一次大根堆調整

這樣直到節點數歸0,即數列排序完畢

三:改良的交換排序(快速排序)

取出數列第乙個元素,既然第乙個元素已經取出保護,則第乙個元素可以視為空,

分別從第乙個元素和最後乙個元素開始,用非空的那個元素進行比較,當非空元素小於取出得第乙個元素,則將非空元素放到head上,反之則放到tail上

int tmp = data[head]

;int start = head;

int end = tail;

if(head >= tail)

while

(head < tail)

if(head < tail)

while

(head < tail && data[head]

<= tmp)

if(head < tail)

} data[head]

= tmp;

quickonce

(data, count, start, head -1)

;quickonce

(data, count, head +

1, end)

;

開始head為0;

1.用tail與tmp比較:

1.1 若tail >= tmp, tail–,重複第一步

1.2 若tail < tmp, head與tail值互換

1.3 tail–

2.用head與tmp比較:

2.1 若head <= tmp, head++,重複第二步

2.2 若head > tmp, head與tail值互換

2.3 head++

第一步和第二步重複執行,直到head >= tail

這是一次快速排序,但這一次結束後,中間元素是最開始的第乙個元素,該元素左側和右側分別為比它小和大的元素,

左側右側又該重複進行排序

可以發現這種排序一直在進行重複的工作,只是head和tail還有tmp在變化(即起始、終點位置變化,基準元素變化)

所以可以用函式遞迴呼叫實現

不用遞迴也可以用堆疊代替,因為遞迴是基於新的位置進行重複操作,那麼用堆疊去記錄新的起始、終點位置,在每次處理前進行

出棧,處理後進行新位置入棧即可

例:一開始入棧0和count-1

接下來入棧(start和head -1) 和 (head +1和end)

若堆疊非空則重複上述操作,就可以替代遞迴

希爾排序,堆排序,快速排序

插入排序的改進演算法,不穩定的排序演算法,空間複雜度為o 1 public static void shellsort int a 氣泡排序的改進演算法,不穩定的排序演算法 空間複雜度在o log2n 和o n 之間 時間複雜度在o n 和o n2 之間,平均時間複雜度為o nlog2n 而當陣列初...

希爾排序,快速排序,堆排序

最近在準備資料結構的考試,於是用部落格記錄下自己複習的過程。今天的內容是三種高階排序。希爾排序 當序列增量為incr k 2 t k 1 1時,時間複雜度為o n1.5 以序列增量分組,對每組進行大小調整。templatevoid shellinsert t elem,int n,int incr ...

希爾排序,堆排序,快速排序

希爾排序 最優情況下 時間複雜度為 o n 1.3 最差的情況下為 o n 2 增量序列的最後乙個增量值必須等於1 shell sort vector v1 堆排序 void heapadjust int a,int m,int n for i n i 1 i 快速排序 快排在樞紐選取時可以優化,三...