希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。
希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,
也称为缩小增量排序。
核心思想:希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;
随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,
算法便终止。
简单来说:原来插入排序是需要每插入一个新的值,就需要与前面的每个值进行比较,
现在是先有个gap,就是所谓的步长,先让这个gap步长的一组数执行插入排序,这样
一组gap的数排序好后,再把gap缩小,再进行插入排序,直至gap=1位置,再执行
插入排序,这样经过前面几次gap后,列表中的数据相对有序了,最后一次进行插入
排序的时候,需要移动的次数就会变少,从而提高排序效率。
Python算法实现:
def shellSort(data):
#步长,循环每次循环除以2,直到1停止
gap = int(len(data)/2)
while gap > 0:
for i in range(gap,len(data),1):
j = 0
j = i - gap
temp = data[i]
while (j >= 0 ):
# 这样写代码有问题,只是data[j]与data[i]位置的值做了比较,这样是不对的,因为一旦data[i]的值发生改变了
# 则修改了原来需要比较的值,比如:3,6,1,那么我们是需要用1不断与前面的,3,6来进行比较,
# 应该拿data[i]与之前距离是gap的所有的值都比较,下面注释的代码是错误的写法,记录一下
#if (data[j] > data[i]):
#data[j], data[i] = data[i], data[j]
#j = j - gap
if (data[j] > temp):
data[j + gap],data[j] = data[j],temp
j = j - gap
print("gap=%d"%gap, end="")
print(data)
#减小增量
gap = int(gap/2)
def main():
data = list(map(int,input("请输入需要排序的列表,逗号间隔:").split(",")))
#1,4,2,7,9,8,3,6
#9,1,2,5,7,4,8,6,3,5
#3,6,1
shellSort(data)
print("希尔排序结果为:", end="")
print(data)
if __name__ == "__main__":
main()