介绍
插入排序的工作原理是,对每个未排序数据, 插入到前面以排序的数据中,从后往前比较插入
步骤:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果被扫描的元素(已排序)大于新元素,将该元素后移一位
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤2~5
代码实现
def insert_sort_(lst):
n = len(lst)
for i in range(1,n):#默认第一个是已经排好序的
if lst[i] < lst[i-1]:#如果本次的值小于前一个(前面是排好序的)
num = lst[i] # 记录本次的值
index = i # 记录值的下标
for j in range(i - 1, -1, -1): # 从i-1 循环到 0 (包括0)
if lst[j] > num:#此数大于本次值
lst[j + 1] = lst[j]#此数向后移一位
index = j # 记录带插入的下标
else:
break
lst[index] = num
优化
看网上比较多的一种思想是,在向前插入的时候,使用二分查找法,减少比较此数
def insert_sort_1(lst):
n = len(lst)
for i in range(1,n):#默认第一个是已经排好序的
if lst[i] < lst[i-1]:#如果本次的值小于前一个(前面是排好序的)
num = lst[i] # 记录本次的值
index = i # 记录值的下标
left = 0
right = i-1
# 待插入的值与已排序区域的中间值比较,不断缩小区域范围,直到left和right相遇。
while left <= right:
mid = (left + right) // 2
if num < lst[mid]:
right = mid - 1
else:
left = mid + 1
# 当left 和 right 相遇的时候,待插入的位置其实就是left的位置
for j in range(i - 1, left - 1, -1):
lst[j + 1] = lst[j]
lst[left] = num
调用

结果


本文介绍了插入排序的工作原理,详细解析了其步骤,并提供了代码实现。为了提高效率,文章提出了利用二分查找法进行优化。同时,给出了排序算法的调用过程及运行结果。

1212

被折叠的 条评论
为什么被折叠?



