对于只有一个元素的数组,本身为已序。
对于两个元素的a, 认为 a0 为已序,a1为key ,若key > a0 则将key 放到a0后。若不是,后移a0
对于多个元素的数组:
考虑将key 插入到已序的 a0-aj(a0 <= a1 < a2...) 中,可以将key 与aj - a0 逐个比较,并后移,直到遇到一个比key 小的ak 。将key 放到ak以后就可以了。
代码也很简单。
#/usr/bin/env python
import random
def insertion_sort(a):
'''
Demostration for insertion algorithm
a is the list to be sorted
'''
i=1
while i < len(a):
key=a[i]
j = int(i -1)
while j >= 0 and a[j] > key:
a[j+1] = a[j]
print ' a[' , j ,']->a[', j+1,']'
print a
j = j-1
a[j+1] = key
print 'key -> a[' , j+1, ']'
print a
i = i+1
return a
if __name__ == '__main__':
a=[]
b=list()
for i in range(1000):
b.append(i)
for i in range(5):
#choose 5 random numbers in (1...1000) as a sort list
a.append( random.choice(b))
print a
insertion_sort(a)
print sorted(a)
运行的示例:
C:/Users/ly/i2a>python insertion_sort.py
[45, 3, 113, 111, 346]
a[ 0 ]->a[ 1 ]
[45, 45, 113, 111, 346]
key -> a[ 0 ]
[3, 45, 113, 111, 346]
key -> a[ 2 ]
[3, 45, 113, 111, 346]
a[ 2 ]->a[ 3 ]
[3, 45, 113, 113, 346]
key -> a[ 2 ]
[3, 45, 111, 113, 346]
key -> a[ 4 ]
[3, 45, 111, 113, 346]
[3, 45, 111, 113, 346]
插入排序使用了很重要的思想:对于已知n个数的解决方案,想办法推广到n+1的情况下。