[算法笔记]: Python 实现的梳排序

509 阅读1分钟

算法思路

j ← n, s ← 1.3, flag = false

while (j > 1 || falg = true) {
    
    j = max( j / s, 1)
    
    flag = false
    
    i = 0
    
    while (i + j <= n-1) {
        
        if (a[i] > a[i + j]) {
            
            swap(a[i], a[i + j])
            
            flag = true
        }
        
        i++
    }
}

Python实现

def comb_sort(numbers):
    n = len(numbers)
    # 设置初始阵列长度为n
    j = n
    # 设置递减比率
    s = 1.3
    flag = False
    
    # 在循环中,不断缩小j,直至为1
    while (j > 1 or flag == True):
        j = max(math.floor(j / s), 1)
        flag = False
        i = 0
        while (i + j <= n - 1):
            if (numbers[i] > numbers[i+j]):
                numbers[i], numbers[i+j] = numbers[i + j], numbers[i]
                flag = True
            i = i + 1

    return numbers

待排序的数组

numbers = [40, 99, 31, 6, 52, 58, 7, 54, 55, 22]

排序完成的结果

numbers = [6, 7, 22, 31, 40, 52, 54, 55, 58, 99]

心得

  • 在冒泡排序算法中,只比较阵列中相邻的二项,即比较的二项的间距(j)是1,梳排序提出此间距其实可大于1
  • 梳排序开始时,设定间距为阵列长度,并在循环中以固定比率递减,递减率设定为1.3
  • 在一次循环中,梳排序如同冒泡排序一样把阵列从首到尾扫描一次,比较及交换两项
  • 如果间距递减至1,梳排序假定输入阵列大致排序好,并以冒泡排序作最后检查及修正。