排序-希尔
希尔排序是希尔(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()