根据Thomas H.Cormen等同学编写的经典书籍《算法》中的第一部分基础算法,依照书中的伪代码,并参考其他大佬们以实现的排序算法,利用python来实现并记录在本博客中。
1.参考原书代码
# -*- coding: utf-8 -*-
"""
Spyder Editor
Contetnt: 算法第三版 第一部分 第二章节算法基础 插入排序法
算法的核心是比较当前数和前一个数的关系,如果当前数大于前数,则跳过,反之,调换两数位置
随后,再比较换位之后的的前数,和其前数的大小,执行循环遍历
This is a temporary script file.
"""
#构建插入排序函数
def InsertionSort(arr):
j = 1 #当前数从2开始,保证有前一位数可以与值比较(也即存在j-1)
for j in range(len(arr)): #在数组中遍历
key = arr[j] #将当前数赋予临时变量key
i = j-1 #获取前一位数
#利用while()进行条件判断变量,前一位是否大于后一位
while( (i >= 0) and (arr[i] > key )):
arr[i+1] = arr[i] #如果大于,则前数替换当前数
i =i - 1 #i-1很重要,与i>=0组合判断 前两位数和当前数的关系,并执行交换
arr[i+1] = key #最后最开始的当前数key,放在变量后的位置
return arr
#给定数组
arr = [1, 5, 4, 7, 9, 3, 21, 6]
#打印
print(InsertionSort(arr))
2. 其他大佬代码
nullhttps://blog.csdn.net/superjunjin/article/details/104108494
def InsertionSort1(arr):
j = 1
for j in range(len(arr)):
i=j #这里很关键,将当前数索引赋予i, i-1可得到前一数值,进而进行比较
while(i>0 and arr[i-1]>arr[i]):
arr[i], arr[i-1] = arr[i-1], arr[i] #直接交换两数
i -= 1
return arr
3.总结
插入排序法的核心在于判断当前数(i)和前数(i-1)的关系,如果前数待遇当前数,则交换俩数值。如果此时i-1不等于0,意味着i-1前还有数值,需要循环遍历前数(i-1)-1与当前数(i-1)之间的关系,并判断是否需要交换。