数据结构与算法 代码整理:常见的插入排序法
直接插入排序
1 # 直接插入排序 2 def InsertSort(s): 3 for i in range(1,len(s)): 4 # 往有序数组s[:i]中插入元素s[i],当新元素比末尾元素小时,往前插入 5 if s[i] < s[i-1]: 6 x = s[i] 7 j = i-1 8 while x<s[j] and j>=0: # 如果目标比当前位置元素小,并前没有越界 9 j = j-1 # 则继续查找前面的元素 10 s[j+1] = s[j] # 1. 采用单独移动 11 # 注意:当最前面的元素比x小时,j=-1 12 # 将查找到比x大的元素之后的所有元素,后移一位 13 # s[j+2:i+1] = s[j+1:i] # 2. 采用统一移动 14 s[j+1] = x
折半插入排序
1 # 折半插入排序 2 # 往有序区域中插入元素,但使用折半查找法寻找合适位置 3 def BinInsertSort(s): 4 for i in range(1,len(s)): 5 if s[i] < s[i-1]: 6 x = s[i] 7 low = 0; high = i-1 # 设置初始区间 8 while low<=high: 9 mid = (low+high)//2 10 if x < s[mid]: high = mid - 1 # 插入位置在高半区中 11 else: low = mid + 1 # 插入位置在低半区中 12 # s[high+2:i+1] = s[high+1:i] # high+1 为插入位置,其余元素后移 13 for j in range(i-1,high,-1): #注意逆序索引的结束标志: 自(high,...,i-1],也即[high+1,...,i-1]向后移动 14 s[j+1] = s[j] 15 s[high+1] = x
希尔插入排序
1 # 希尔插入排序 2 def ShellSort(s): 3 gap = len(s)/2 4 while gap > 0: 5 for i in range(gap,len(s)): # 对每组数据进行组内排序 6 # s[i,i+gap,i+2gap,i+ngap] 7 # 对余数的处理,通过将间隔继续后移解决 8 x = s[i] 9 j = i - gap 10 while x<s[j] and j>=0: 11 s[j+gap] = s[j] # 元素后移 12 j -= gap 13 s[j+gap] = x 14 gap /= 2