入坑后的算法初学:用Python实现插入排序
参考书籍:《我的第一本算法书》
实现语言:Python
一:算法步骤描述
(1)得到一个任意排序任意长度大小的数字序列,假设将它分为已被排序过的"有序区间"和未被排序过的"待排序区间"。
(2)将"待排序区间"的数字依次和"有序区间"的数字进行比较,找到一个适合自己插入的位置坐下。
(3)待所有的数都进入"有序区间"后,排序结束。
二:图解
二:代码块
'''
插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据
陆续归位,而右侧留下的就是还未被排序的数据。插入排序的思路就是从右侧的未排序区域内
取出一个数据,然后将它插入到已排序区域内合适的位置上。
'''
def charu(num_list):
for i in range(1, len(num_list)):
'''
i的取值范围是待比较区间的索引[i,num_list的长度)
j的取值范围是有序区间的索引 [0,i)
(1)第一层for循环表示循环待排序区间,每一次循环表示比较完一轮,有序区间就会多一个数,无序区间也会少一个数
(2)第一轮默认是排序过的,所以左边第一个数表示已经进入有序区间,待排序区间[1,数组长度)=> i,有序区间[0,0]=> j
(3)第二层for循环表示无序区间中从左边开始数的第一个数依次和有序区间进行比较(从有序区间右边开始),直到找到一个合
适自己的位置然后插入
(4)直到所有的数都进入了有序区间,排序停止
'''
print("第{}轮比较".format(i))
'''
第二层for循环的循环体是为了实现:将正在寻找位置的"无序区间数字"从有序区间的从右往左开始比较 [1,3,4,5] <= 2
'''
for j in range(i - 1, -1, -1):
if num_list[j + 1] < num_list[j]: # 判断是否需要交换位置
num_list[j + 1], num_list[j] = num_list[j], num_list[j + 1]
if num_list[j] >= num_list[j - 1] or j == 0:
# 判断是否找到合适自己的位置,找到了就停止这一轮的比较,j = 0表示前面已经没有数可以比了,你就是最小的!
break
else:
break
print(num_list)
return num_list
charu([4, 3, 7, 3, 8, 5, 6, 2, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1])
三:输出效果
第1轮比较
[3, 4, 7, 3, 8, 5, 6, 2, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]
第2轮比较
[3, 4, 7, 3, 8, 5, 6, 2, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]
第3轮比较
[3, 3, 4, 7, 8, 5, 6, 2, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]
第4轮比较
[3, 3, 4, 7, 8, 5, 6, 2, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]
第5轮比较
[3, 3, 4, 5, 7, 8, 6, 2, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]
第6轮比较
[3, 3, 4, 5, 6, 7, 8, 2, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]
第7轮比较
[2, 3, 3, 4, 5, 6, 7, 8, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]
第8轮比较
[2, 3, 3, 4, 5, 6, 7, 8, 25, 2, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]
第9轮比较
[2, 2, 3, 3, 4, 5, 6, 7, 8, 25, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]
第10轮比较
[2, 2, 3, 3, 4, 5, 6, 7, 8, 25, 67, 3, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]
第11轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 7, 8, 25, 67, 6, 7, 13, 51, 35, 23, 76, 4, 23, 1]
第12轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 8, 25, 67, 7, 13, 51, 35, 23, 76, 4, 23, 1]
第13轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 7, 8, 25, 67, 13, 51, 35, 23, 76, 4, 23, 1]
第14轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 7, 8, 13, 25, 67, 51, 35, 23, 76, 4, 23, 1]
第15轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 7, 8, 13, 25, 51, 67, 35, 23, 76, 4, 23, 1]
第16轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 7, 8, 13, 25, 35, 51, 67, 23, 76, 4, 23, 1]
第17轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 7, 8, 13, 23, 25, 35, 51, 67, 76, 4, 23, 1]
第18轮比较
[2, 2, 3, 3, 3, 4, 5, 6, 6, 7, 7, 8, 13, 23, 25, 35, 51, 67, 76, 4, 23, 1]
第19轮比较
[2, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 13, 23, 25, 35, 51, 67, 76, 23, 1]
第20轮比较
[2, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 13, 23, 23, 25, 35, 51, 67, 76, 1]
第21轮比较
[1, 2, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7, 7, 8, 13, 23, 23, 25, 35, 51, 67, 76]