排序>>交換排序>>梳子排序
List:
1 2 3 |
0.概念+虛擬碼+示例分析 1.梳子排序實現 2.Question |
- start
基本概念:
維基百科http://zh.wikipedia.org/wiki/%E6%A2%B3%E6%8E%92%E5%BA%8F
虛擬碼
1 2 3 4 |
function comb_sort(A: list[1..n]){ gap = A.size rate = 1.3 while gap 1 |
梳子排序:
間隔gap 遞減率rate(大於1的數)
比較 i 和 i+gap 位置的數字,若反序,交換,然後i+=1,直到比較i+gap超過最大索引
然後gap /= rate,再重複上面操作
直到gap=1 ,執行最後一遍梳理後結束
可以想象成 先拿一把大梳子(只有三個齒兩個縫的)從第一個梳到最後一個,把兩個縫隙裡面反序的數交換
再換把小點的梳子,重複.
最終,中間那個齒消失(梳理相鄰兩個數),完成最後一遍梳理
例子:(關注gap和cmp的下標)
1 |
[8, 4, 3, 7, 6, 5, 2, 1] |
gap: 6 [初始設定gap=size/1.3]
1 2 3 4 5 |
cmp l[0]=8,l[6]=2 change [2, 4, 3, 7, 6, 5,8, 1] cmp l[1]=4,l[7]=1 change [2, 1, 3, 7, 6, 5, 8,4] one time: [2, 1, 3, 7, 6, 5, 8, 4] |
gap: 4
1 2 3 4 5 6 |
cmp l[0]=2,l[4]=6 cmp l[1]=1,l[5]=5 cmp l[2]=3,l[6]=8 cmp l[3]=7,l[7]=4 change [2, 1, 3, 4, 6, 5, 8,7] one time: [2, 1, 3, 4, 6, 5, 8, 7] |
gap: 3
1 2 3 4 5 6 |
cmp l[0]=2,l[3]=4 cmp l[1]=1,l[4]=6 cmp l[2]=3,l[5]=5 cmp l[3]=4,l[6]=8 cmp l[4]=6,l[7]=7 one time: [2, 1, 3, 4, 6, 5, 8, 7] |
gap: 2
1 2 3 4 5 6 7 |
cmp l[0]=2,l[2]=3 cmp l[1]=1,l[3]=4 cmp l[2]=3,l[4]=6 cmp l[3]=4,l[5]=5 cmp l[4]=6,l[6]=8 cmp l[5]=5,l[7]=7 one time: [2, 1, 3, 4, 6, 5, 8, 7] |
gap: 1
1 2 3 4 5 6 7 8 9 10 11 |
cmp l[0]=2,l[1]=1 change [1,2, 3, 4, 6, 5, 8, 7] cmp l[1]=2,l[2]=3 cmp l[2]=3,l[3]=4 cmp l[3]=4,l[4]=6 cmp l[4]=6,l[5]=5 change [1, 2, 3, 4, 5,6, 8, 7] cmp l[5]=6,l[6]=8 cmp l[6]=8,l[7]=7 change [1, 2, 3, 4, 5, 6, 7,8] one time: [1, 2, 3, 4, 5, 6, 7, 8] |
觀察上面例子,梳排序可以有效地將烏龜(尾部的小數值和頭部的大數值)調整到有序後位置的附近
- start
:::python
def comb_sort(l):
dis = int(len(l)/1.3)
while dis:
for i in range(len(l)-dis):
if l[i] > l[i+dis]:
l[i], l[i+dis] = l[i+dis], l[i]
dis = int(dis/1.3)
2 start
A.奇偶排序概念,過程描述?
B. 時間複雜度?空間複雜度?是否是穩定排序?
C.適用場景
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式