数据结构与算法 代码整理:常见的插入排序法

直接插入排序

 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

 

posted on 2015-08-12 15:51  hanahimi  阅读(482)  评论(0编辑  收藏  举报

导航