插入排序(Insertion Sort)
基本思想是:将列表分为2部分,左边为排序好的部分,右边为未排序的部分
循环整个列表,每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止
插入排序非常类似于整扑克牌。
在开始摸牌时,左手是空的,接着,一次从桌上摸起一张牌,并将它插入到左手一把牌中的正确位置上。
为了找到这张牌的正确位置,要将它与手中已有的牌从右到左地进行比较。无论什么时候,左手中的牌都是排好序的。因此这里有一个重要的前提:手里的牌已经是排好序的。
编程对一个数组进行插入排序也是同样,和插入扑克牌有一点不同
不可能在两个相邻的存储单元之间再插入一个单元,因此要将插入点之后的数据依次往后移动一个单元。
代码实现:
# -*- coding:utf-8 -*-
__author__ = 'ZHONGZHIKUN408'
data_set = [ 9,1,22,9,31,-5,45,3,6,2,11 ]
for i in range(len(data_set)):
print("i=%d" %i)
# position = i
while i > 0 and data_set[i] < data_set[i-1]:
# 后边小于前边的值,就交换位置,把小的交换到前面
print "switch %d and %d" %(data_set[i],data_set[i-1])
tmp = data_set[i]
data_set[i] = data_set[i-1]
data_set[i-1] = tmp
i -= 1 # 这一步代码很重要,实现把最小的不断和前面拍好的比较,排到合适位置
# 每次拿到一个data_set[i],和前面排好顺序的比较,只要比较到前面小于d[i],就排好了
# 直到前移直到此元素放到排序好的列表的适当位置 为止
print(data_set)
# i=0
# i=1
# switch 1 and 9
# [1, 9, 22, 9, 31, -5, 45, 3, 6, 2, 11]
# i=2
# i=3
# switch 9 and 22
# [1, 9, 9, 22, 31, -5, 45, 3, 6, 2, 11]
# i=4
# i=5
# switch -5 and 31
# [1, 9, 9, 22, -5, 31, 45, 3, 6, 2, 11]
# switch -5 and 22
# [1, 9, 9, -5, 22, 31, 45, 3, 6, 2, 11]
# switch -5 and 9
# [1, 9, -5, 9, 22, 31, 45, 3, 6, 2, 11]
# switch -5 and 9
# [1, -5, 9, 9, 22, 31, 45, 3, 6, 2, 11]
# switch -5 and 1
# [-5, 1, 9, 9, 22, 31, 45, 3, 6, 2, 11]
# i=6
# i=7
# switch 3 and 45
# [-5, 1, 9, 9, 22, 31, 3, 45, 6, 2, 11]
# switch 3 and 31
# [-5, 1, 9, 9, 22, 3, 31, 45, 6, 2, 11]
# switch 3 and 22
# [-5, 1, 9, 9, 3, 22, 31, 45, 6, 2, 11]
# switch 3 and 9
# [-5, 1, 9, 3, 9, 22, 31, 45, 6, 2, 11]
# switch 3 and 9
# [-5, 1, 3, 9, 9, 22, 31, 45, 6, 2, 11]
简洁版:
# -*- coding:utf-8 -*-
__author__ = 'ZHONGZHIKUN408'
data_set = [ 9,1,22,9,31,-5,45,3,6,2,11 ]
for i in range(len(data_set)):
while i > 0 and data_set[i] < data_set[i-1]:
tmp = data_set[i]
data_set[i] = data_set[i-1]
data_set[i-1] = tmp
i -= 1
print(data_set)
编程思路:
for循环遍历列表,通过while循环(while i > 0 and data_set[i] < data_set[i-1]:),比较i和前面一个元素i-1比较,小的话,放到前面。还有 i -= 1,实现不断把未排好的序列的第一个元素和前面排好的序列比较,实现这种效果: -5不断比较排到了前面
# i=5
# switch -5 and 31
# [1, 9, 9, 22, -5, 31, 45, 3, 6, 2, 11]
# switch -5 and 22
# [1, 9, 9, -5, 22, 31, 45, 3, 6, 2, 11]
# switch -5 and 9
# [1, 9, -5, 9, 22, 31, 45, 3, 6, 2, 11]
# switch -5 and 9
# [1, -5, 9, 9, 22, 31, 45, 3, 6, 2, 11]
# switch -5 and 1
# [-5, 1, 9, 9, 22, 31, 45, 3, 6, 2, 11]