希尔排序
希尔排序:是一种对于插入排序的改进,将待排序数组按一定的步长进行分组,分别对每一个分组进行插入排序,到达部分有序;然后,缩小步长,重新分组,进行插入排序,直到步长为1,对基本有序的数组进行插入排序。
对每一个分组进行插入排序时,不是对第一个组全部完成后,再对第二个组进行;而是先将第一个组的第二个元素插入第一个组然后,将第二个组的自二个元素插入第二组中。先插入1b,然后是2b,3b。。。然后是1c,2c,3c
"""
希尔排序:
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,
再对全体记录进行依次直接插入排序。
该方法的基本思想是:
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,
然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。
因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
"""
def ShellSort(arr):
# 首先初始步长选择为数组长度的一半
l = len(arr)
grap = int(l/2)
while grap > 0: # 当步长不为0,依次对分组进行插入排序
# 从每一个分组的第二个元素开始进行插入
for i in range(grap,l):
key = arr[i] # key记录当前分组需要插入的元素
j = i # j用来索引当前分组的正确位置
while j >= grap and arr[j-grap] > key:
# 当同一组的前一个元素比key大时,需要进行后移
arr[j] = arr[j-grap]
j = j - grap
arr[j] = key
grap = int(grap/2)
return arr
if __name__ == '__main__':
a = [5, 7, 8, 3, 1, 2, 4, 6, 5, 8, 7]
print(ShellSort(a))