算法思路
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,梳排序假定输入阵列大致排序好,并以冒泡排序作最后检查及修正。