希尔排序的思想
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。先取一个小于n的整数d1作为第一个增量,把文件的全部记录分组。所有距离为d1的数据放在一起。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量等于1,即所有记录放在同一组中进行直接插入排序为止。该方法实质上是一种分组插入方法。一般的初次取序列的一半为增量,以后每次减半,直到增量为1。即gap=n//2
希尔排序的代码实现
def shell_sort(alist):
n=len(alist)
gap=n//2 # 取整除
while gap > 0:
for j in range(gap,n):
i=j
while i > 0:
if alist[i] < alist[i-gap]:
alist[i],alist[i-gap]=alist[i-gap],alist[i]
i=i-gap
else:
break;
gap=gap//2
#return alist
if __name__ =="__main__":
alist=[0,1,8,7,9,2,10]
print(alist)
shell_sort(alist)
print(alist)
其中只是把直接插入排序进行了一点点的改进,仅仅改变了交换的步长,比较的是选出来的每一部分而不是一个整体了。此代码是用了while循环。
def shell_sort(alist):
n=len(alist)
gap=n//2 # 取整除
while gap > 0:
for j in range(gap,n):
for i in range(j,0,-gap):
if alist[i] < alist[i-gap]:
alist[i],alist[i-gap]=alist[i-gap],alist[i]
else:
break;
gap=gap//2
#return alist
if __name__ =="__main__":
alist=[0,1,8,7,9,2,10]
print(alist)
shell_sort(alist)
print(alist)
第二种方法,实现希尔排序,是把直接插入排序改成了两个for循环的格式
关键
用一个while循环进行控制,因为只有gap等于1时循环才会停止,所以,每次比完一次之后,gap就变成原来的一半,while循环来控制gap等于1这个条件,一旦满足条件结束循环。