希尔排序
希尔排序
- 先取一个正整数d1<n,把所有序号相隔d1的数组元素放一组,组内进行直接插入排序;
- 然后取d2<d1,重复上述分组和排序操作;
- 直至di=1,即所有记录放进一个组中排序为止。
如下图,该列表有九个项。如果我们使用三的增量,有三个子列表,每个子列表可以通过插入排序进行排序。

完成这些排序后,我们得到如下图 所示的列表。虽然这个列表没有完全排序,但发生了很有趣的事情。 通过排序子列表,我们已将项目移动到更接近他们实际所属的位置。

接下来使用增量为 1 的插入排序; 换句话说,标准插入排序。注意,通过执行之前的子列表排序,我们减少了将列表置于其最终顺序所需的移位操作的总数。对于这种情况,我们只需要四次移位完成该过程。

希尔排序的实现
def shellSort(alist):
sublistcount = len(alist)//2
while sublistcount > 0:
#一次将分段的起始元素开始输入到分段插入排序中
for startposition in range(sublistcount):
gapInsertionSort(alist,startposition,sublistcount)
print("After increments of size",sublistcount,"The list is",alist)
sublistcount = sublistcount // 2
#本质上实现的是插入排序
def gapInsertionSort(alist,start,gap):
for i in range(start+gap,len(alist),gap):
currentvalue = alist[i]
position = i
while position>=gap and alist[position-gap]>currentvalue:
alist[position]=alist[position-gap]
position = position-gap
alist[position]=currentvalue
测试:
alist = [54,26,93,17,77,31,44,55,20]
shellSort(alist)
print(alist)
参考:

浙公网安备 33010602011771号