希尔排序

1. 希尔排序

思路: 是优化了的插入排序,可以改进当最值处于头或尾需要多次移动元素的问题,因为它会设置步长k(>=1),初始步长是len/2, 先保证步长为k的每个子数组有序,再进一步缩小步长直到为1的时候,数组基本有序。

'''
希尔排序
时间复杂度
  平均:O(nlogn)
  最好:O(nlogn)
  最坏:O(nlogn)
空间复杂度: O(1)
'''

def shellSort(arr):
    if not arr or len(arr) == 1:
        return
    length = len(arr)
    gap = length // 2 # 组的个数
    while gap > 0:
        for i in range (gap, length): # 把arr[i] 插到所在分组的正确位置
            insertSub(arr, gap, i)
            i += 1
        gap = gap // 2

def insertSub(arr, gap, i):
    temp = arr[i]
    k = i - gap
    while (k >= 0 and (temp < arr[k])): # 跟插入排序一样一样的
        arr[k + gap] = arr[k]
        k -= gap
    arr[k + gap] = temp

def insertSub2(arr, gap, i): # 这个更好理解
inserted = arr[i]
j = i - gap
while j >= 0 and inserted < arr[j]:
arr[j+gap],arr[j] = arr[j],arr[j+gap]
j -= gap

 

posted @ 2021-04-28 17:52  水天需  阅读(92)  评论(0编辑  收藏  举报