一:改良的直接插入排序(希爾排序)
優化考慮:因為直接插入排序對於大致有順序的數列效率較高,希爾排序即將數列先進行一定排序
希爾:
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 快速排序 快排在樞紐選取時可以優化,三...