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