數據結構&算法實踐—【排序|交換排序】梳子排序

轉載請註明出處:http://blog.csdn.net/wklken

回主目錄


排序>>交換排序>>梳子排序

List:

0.概念+僞代碼+示例分析

1.梳子排序實現

2.Question



僞代碼
function comb_sort(A: list[1..n]){
    gap = A.size
    rate = 1.3
    while gap <= 1 && swap = 0{
        //更新間距
        gap := (int)gap/rate
        swap := 0
        i := 0
        //梳一次
        while i + gap < A.size{
            if A[i] > A[i+gap]
               A(array[i] , A[i+gap])
               swap := 1 
            i := i + 1
        }
    }
}


梳子排序:
間隔gap   遞減率rate(大於1的數)
比較 i 和 i+gap 位置的數字,若反序,交換,然後i+=1,直到比較i+gap超過最大索引
然後gap /= rate,再重複上面操作
直到gap=1 ,執行最後一遍梳理後結束

可以想象成 先拿一把大梳子(只有三個齒兩個縫的)從第一個梳到最後一個,把兩個縫隙裏面反序的數交換
再換把小點的梳子,重複.
最終,中間那個齒消失(梳理相鄰兩個數),完成最後一遍梳理

例子:(關注gap和cmp的下標)
[8, 4, 3, 7, 6, 5, 2, 1]
gap:  6  [初始設定gap=size/1.3]
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
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
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
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
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]

觀察上面例子,梳排序可以有效地將烏龜(尾部的小數值和頭部的大數值)調整到有序後位置的附近


1 start
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.適用場景



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章