python算法之插入排序

时间:2024-11-26 12:03:38
插入排序非常类似于整扑克牌。
在开始摸牌时,左手是空的,牌面朝下放在桌上。接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。为了找到这张牌的正确位置,要将它与手中已有的牌从右到左地进行比较。
无论什么时候,左手中的牌都是排好序的。
也许你没有意识到,但其实你的思考过程是这样的:现在抓到一张7,把它和手里的牌从右到左依次比较,7
比10小,应该再往左插,7
比5大,好,就插这里。为什么比较了10和5就可以确定7的位置?为什么不用再比较左边的4和2呢?因为这里有一个重要的前提:手里的牌已经是排好序的。现在我插了7之后,手里的牌仍然是排好序的
,下次再抓到的牌还可以用这个方法插入。编程对一个数组进行插入排序也是同样道理,但和插入扑克牌有一点不同,不可能在两个相邻的存储单元之间再插入一个单元,因此要将插入点之后的数据依
次往后移动一个单元。 array_a=[12,23,11,9,5,15,13,48,37,6]
loop_num=0
swap_num=0
for index in range(1,len(array_a)): #index从1开始循环,因为从数组的第二个元素开始比较,比较数组元素个数-1次
insert_value=array_a[index] #定义1个变量,用于保存当前需插入的数组元素值
position=index #定义一个变量,用于保存需要插入数组下标位置,用于控制循环
while position>0 and array_a[position-1]>insert_value: #当position大于0表示最多放在数组的第一个位置,第二个条件表示从右向左(已经排好序的数组)比较要插入的值大小。
array_a[position]=array_a[position-1] #把排好序数组右边的值向右移动,覆盖掉要插入的值位置,因为要插入的值已经保存到insert_value中。
swap_num+=1
position-=1 #将p值减1是为了继续从右向左比较大小,找到合适的位置。
array_a[position]=insert_value #找到合适的位置后,就将插入的值放在该位置上,完成插入。
print(array_a) #打印每一次的移动情况
print("swap_loop=",swap_num)
'''
结果:
[12, 23, 11, 9, 5, 15, 13, 48, 37, 6] 比较数组0和1,不交换
[11, 12, 23, 9, 5, 15, 13, 48, 37, 6] 2和1,2和0比较,比较后先把1移动到2位置,再把0移动到1的位置,最后把2移动到0的位置。完成插入
[9, 11, 12, 23, 5, 15, 13, 48, 37, 6]
[5, 9, 11, 12, 23, 15, 13, 48, 37, 6]
[5, 9, 11, 12, 15, 23, 13, 48, 37, 6]
[5, 9, 11, 12, 13, 15, 23, 48, 37, 6]
[5, 9, 11, 12, 13, 15, 23, 48, 37, 6]
[5, 9, 11, 12, 13, 15, 23, 37, 48, 6]
[5, 6, 9, 11, 12, 13, 15, 23, 37, 48]