def insertion_sort_v2(nums):
n = len(nums)
# 从第二个数开始往后遍历
for i in range(1, n, 1):
# 加速方法: 既然i-1之前的所有元素都是有序的,如果i比i-1的大或相等,则不用多次一举从前到后了
# 只有i比i-1对应的元素小,才需要与前面的比较
if nums[i] >= nums[i-1]:
continue
temp = nums[i] # 将当前元素缓存
j = i
# 逆序将j-1及其之前所有元素与i对应的temp比较,如果比temp大则右移一位,
# 直到某个j-1上的数不大于temp
# 或者j=0了,此时原来j=0的元素一定是因为大于temp而右移到了1这个位置,0上空缺
while (j > 0) and (nums[j-1] > temp):
nums[j] = nums[j-1]
j -= 1
# 如果j >0, 既然此时j-1上的元素不大于temp,就把temp放在j上
# 如果j+0,此时0上空缺,就把temp放在0=j上
nums[j] = temp
# 此时i及i位置之前的所有数都是从小到大排列的了
# 首先该算法需要从第二个元素开始遍历所有元素,共n-1次
# 最好的情况下,数组本身是有序的,所以每次只需要与之前的一个元素比较一次,即1+1.。。。=n-1次
# 最坏的情况, 数组本身逆序,因此遍历到第i个元素的时候,需要与之前的元素比较i-1次,因此1+2+3+4....=(n)(n-1)/2次
# 平均来看,需要(n-1 + (n)(n-1) /2) / 2 约等于n2/ 4, 因此时间复杂度O(n2)
# 希尔排序能有所改进
a = [4, -1, 2, -1, 3]
insertion_sort_v2(a)
print(a)