插入排序-shell排序
shell排序
这个系列是回顾之前所学,是用python商量着完成的。
路过的大佬就当看个乐,实现算法的方式不一,也有讨巧的做法。
我只讲讲我的思路,希望大家浏览的时候能多多提建议,共同学习共同进步。
--------------------------------------------------------------------------------------------------------
shell排序基本思想:
shell是插入排序的一种高效改进版本,shell排序是不稳定排序算法,该算法由shell在1959年提出而命名,属于比较早的算法之一。
shell排序是把记录按下标的一定增量分组,将其称之为gap,对每组使用直接插入排序算法
每一次分组排序完成,gap都会除以2并向下取整,对更细分的分组进行直接插入排序
直至gap为1,整个文件恰被分成一组,算法便终止。
但就我所理解的,当每次分组完成,比较的永远是每个分组对应下标的值
比如: [2, 4, 5, 1, 3]
其中2、5、3的下标都为0,gap为2,比较的时候就比较它们三个的值,根据降序交换位置
随着gap的减小,整个序列的排序愈发明显
为1时,刚好排完
以下是具体实现:
def shell_sort(list): gap = len(list) // 2 # 1.首先确定一下,第一次gap的值 # 6.gap是要大于等于1的,一般到1就基本ok了 while gap >= 1: for i in range(gap, len(list)): # 2.这里为什么要设置成len(list),这是防止出现序列是奇数的情况,如果这里是gap的倍数那么会落下最后一个值取不到的情况 # 3.这里为啥要从gap开始取值,因为我们是要比较不同组同下标的值嘛 # 5.所以这里是不是还要有一个循环呀? i不能等于0,避免out of range while i > 0: if list[i] < list[i-gap]: # 4.比较大小,这里没什么好讲的 list[i], list[i-gap] = list[i-gap], list[i] else: break # 5.这里会存在一个问题,就是如何确保比较的值一定比前面的值大还是小? # 5.所以我们还是需要拿当前的值去比较前面的值大小,这里就需要迭代一下 i -= gap # 6.那每一次的分组排序完成,我们就需要改变gap值的大小 gap //= 2 return list
以上,接下来实现一下直接插入排序