python 希尔排序
算法思想
1、希尔排序是对直接插入排序的改善
希尔排序是对直接插入排序的改善,由于在最好的情况下(原序列接近有序的情况),直接插入排序的时间复杂度是O(n),因此希尔排序试图通过将原待排序序列分解为更小的序列,对每个子序列先进行插入排序,这将使整个原始序列更加趋于有序状态,从而使得对整体序列进行插入排序时变得高效。
2、具体实施步骤
首先设置元素间隔gap,通常是len(lists)//2,其中lists是待排序序列,//是地板除法,以长度为10的序列lists=[6,8,9,52,8,666,0,1,5,8]为例:
gap=len(lists)//2=5
因此,lists将被分为5组,分别为[6,666],[8,0],[9,1],[52,5],[8,8]
接下来是分别对以上5组进行直接插入排序
排序完毕,合并成长度为10的序列是[6,0,1,5,8,666,8,9,52,8]
至此,gap=5时的排序结束
接下来,gap=gap//2=2,重复以上步骤,直至gap=1,此时对整体序列进行插入排序即可
python实现
#希尔排序:
def shell_sort(lists):
gap=len(lists)//2
while gap>=1:
for i in range(gap,len(lists)):
key=lists[i]
j=i-gap
while j>=0:
if lists[j]>key:
lists[j+gap]=lists[j]
lists[j]=key
j-=gap
gap//=2
lists=[1,5,6,9,8,2,6,52,1314,8,0,520,888,666]
shell_sort(lists)
print(lists)