希尔排序
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