Python数据结构篇(排序算法2)
1希尔排序
1.1 希尔排序的原理
根据步长gap的不同将数列分成n/gap个子序列,然后把子序列进行插入排序,然后不断缩小gap,直到gap=1.
初始gap=n/2
然后每次gap/2直到=1
gap的取值和缩小方法可以自定义!!!
1.2 希尔排序实现:
实现1:完全按照希尔的思路来做,先确定gap 然后分子序列,然后插入排序!!(4个循环)但是最坏时间复杂度是O(n2)
# 比较拙略的方法,但是也是用希尔排序实现了
def shell_sort_my_bad(items):
len_items = len(items)
gap = len_items // 2
while gap > 0:
# 首先要根据gap,分出来gap个子序列
for i in range(0, gap):
# 子序列的表示方法是:(i,i+gap,i+2gap.....)<len,然后对子序列进行插入排序
j = i
# 先写一个插入排序
while j < len_items:
b = j
while b > 0:
if items[b] < items[b - gap]:
items[b], items[b - gap] = items[b - gap], items[b]
else:
break
b -= gap
j += gap
gap = gap // 2
print(items)
实现2:比较简洁的写法,把分子序列和插入排序的外部大循环结合到一起(因为分完子序列以后,每个子序列的每个元素也需要进行-gapd 插入的操作,分完再插和每个元素直接插效果是一样的,不如直接写在一起)
def shell_sort(items):
len_items = len(items)
gap = len_items // 2
while gap > 0:
# 不分子序列了,反正i=gap之后的元素都要在自己的子序列里面沉底,不如一起操作,把所有子序列放在一个遍历里面操作
for i in range(gap, len_items):
j = i
# 而且每个序列,排回去的最后一个元素其实不用操作,所以大于等于gap就可以了
while j >= gap:
if items[j] < items[j - gap]:
items[j], items[j - gap] = items[j - gap], items[j]
else: