目录
1.直接插入排序(Straight Insertion Sort)
2.折半插入排序(Binary Insertion Sort)
前言
本文主要记录一下自己学习过程中的理解,如有错误或冗余欢迎指正与交流~
另,感谢g老师的悉心指导,ta是我的良师益友。
文章总结了插入排序、交换排序、选择排序、归并排序,依据自己的理解来介绍及记录。
一、插入排序
1.直接插入排序(Straight Insertion Sort)
(1)基本思路
Step 1 : 比较每一位(i)上的数与前一位(i - 1)数字的大小,并进行相应操作
① i 位上的数 >= i - 1位上的数:不做处理
② i 位上的数 < i - 1位上的数:将 i 位上的数暂存为某一变量,将 i - 1 位上的数放在 i 位上
Step 2 : 在Step 1 ② 的前提下,依次比较 i - 1 位前(j)的数字与原 i 位上的大小,并进行相应操作
① j 位上的数 <= 原 i 位上的数:不做处理
② j 位上的数 > 原 i 位上的数:将 j 位上的数往后挪一位
Step 3 : 在Step 2 中依次进行比较,直至遇到①的情况 ,即 j 位上的数 >= 原 i 位上的数。此时将 j + 1位上的数赋值为原 i 位上的数,实现 i 位上这一数字的直接插入排序
(2)可行性分析
假设:我们准备对 [5,1,4,3,2] 进行排序
对于第 0 位上的数字 5 ,由于它前面并没有数字可以比大小,所以可以当作一个有序的数组。
于是来看第 1 位上的数字 1 ,将会依次执行Step 1 ② 、Step 3 ,此时数组为 [1,5,4,3,2]
第 2 位上的数字 4 ,依次执行Step 1 ② 、Step 3,此时数组为 [1,4,5,3,2]
第 3 位上的数字 3 ,依次执行Step 1 ② 、Step 2 ②:第 1 位( j 位)上的数字 4 > 原第 3 位(原 i 位)上的数字 3 :将第 1 位( j 位)上的数字 4 往后挪一位,放在第 2 位上。由于第 2 位上的数字 5 在本次排序中的Step 1 ② 中就已经被放在了第 3 位上,所以此操作是可行的。再对前面的数字进行比较,由于第 0 位( j 位)上的数字 1 <= 原第 3 位(原 i 位)上的数字 3,Step 2 结束。Step 3:将原第 3 位(原 i 位)上的数字 3 放在第 1 位上。第 3 位上的数字 3 的直接插入排序结束。此时的数组为[1,3,4,5,2]
类似,第 4 位上的数字 2 ,依次执行Step 1 ② 、Step 2 、Step 3 ,最终直接插入排序完成,最终的数组为[1,2,3,4,5]
(3)代码实现
直接插入排序函数及调用的Python代码如下:
def InsertSort(A):
lens = len(A)
for i in range(1,lens):
if A[i] < A[i - 1]:
temp = A[i]
A[i] = A[i - 1]
j = i - 1
while j >= 0 and temp < A[j]:
A[j + 1] = A[j]
j -= 1
A[j + 1] = temp
return A
InsertSort([5,1,4,3,2])
2.折半插入排序(Binary Insertion Sort)
(1)基本思路
法如其名,主要是利用二分查找的思想,找到数字插入的位置,并插入该数字即可。(可参见LeetCode 35. Search Insert Postion)
Step 1 : 找到第 i 位数的插入点
①将第 i 位前的数看作一个数组,找到该数组的左边界和右边界,并将第 i 位数存入某变量中
②二分查找,比较第 i 位数与中间位置上的数的大小,插入点为最终的右边界的右边一位
a. 若第 i 位数 >= 中间位置上的数:将左边界更新为此时中间位置的右边一位
b. 若第 i 位数 < 中间位置上的数:将右边界更新为此时中间位置的左边一位
Step 2 : 将最终的右边界的右边一位至第 i 位的左边一位依次向右挪动一位
Step 3 : 将第 i