排序思路
待排数组:arr[13]={9,3,13,1,7,5,8,6,2,12,11,10,4}
排后数组:newArr[13]=?
第一轮:定义增量值d,通常首先设定d=arr.length/3+1
d = 13/3 + 1 = 5
从i=5+1=6的位置开始循环,依次对比 i 和 i-5 两个位置的元素大小,当arr[i]>arr[i-5]时,位置不变;当arr[i]<arr[i-5]时,令temp=arr[i],然后在增量为d的子队列中往前查找temp应该插入的位置
newArr={5,3,4,1,7, 9,8,6,2,12, 11,10,13} //相同颜色为一组子序列
第二轮:把增量值d缩小一半
d = 5/2 + 1 = 3
从i=3+1=4的位置开始循环,依次对比 i 和 i-3 两个位置的元素大小,当arr[i]>arr[i-3]时,位置不变;当arr[i]<arr[i-3]时,令temp=arr[i],然后在增量为d的子队列中往前查找temp应该插入的位置
newArr={1,3,2, 5,6,4, 8,7,9, 12,11,10, 13} //相同颜色为一组子序列
第三轮:把增量值d缩小一半
d = 3/2 + 1 = 2
从i=2+1=3的位置开始循环,依次对比 i 和 i-2 两个位置的元素大小,当arr[i]>arr[i-2]时,位置不变;当arr[i]<arr[i-2]时,令temp=arr[i],然后在增量为d的子队列中往前查找temp应该插入的位置
newArr={1,3, 2,4, 6,5, 8,7, 9,10, 11,12, 13} //相同颜色为一组子序列
第四轮:增量值d设置为1
d=1
从i=1+1=2的位置开始循环,依次对比 i 和 i-1 两个位置的元素大小,当arr[i]>arr[i-1]时,位置不变;当arr[i]<arr[i-1]时,令temp=arr[i],然后在增量为d的子队列中往前查找temp应该插入的位置
newArr={1,2,3,4,5,6,7,8,9,10,11,12,13} //相同颜色为一组子序列
时间复杂度
O(n^3/2)
特点
1、是直接插入排序法的改进版本,优点是保存了每一次对比的状态。
2、把原始序列间隔增量值个位置的元素分为N个子序列,把每个子序列通过插入法整理成基本有序序列。
然后不断缩小增量值,不断整理成N个基本有序序列。
直到增量值等于1,基本有序序列就成为绝对有序序列。