问题
对一组元素按照从小到大重新排序
例如:
27, 33, 28, 4, 2, 26, 13, 35, 8, 14
排序后:
2, 4, 8, 13, 14, 26, 27, 28, 33, 35
插入排序算法:
- 从第一个元素开始,该元素可以认为已经被排序
- 取出下一个元素,在已经排序的元素序列中从后向前扫描
- 如果该元素(已排序)大于新元素,将该元素移到下一位置
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
- 将新元素插入到该位置后
- 重复步骤2~5
Python代码示例
# 升序
def insert_sort(alist):
n=len(alist)
# 默认第一个元素已经被排序
if n == 1:
return alist
# 从下一个元素开始
for i in range(1, n):
for j in range(i, 0,-1):
# 依次从后循环已排序的元素与取出的元素对比
if alist[j] < alist[j-1]:
# 交换
alist[j],alist[j-1]=alist[j-1],alist[j]
return alist
alist = [54,26,93,17,77,31,44,55,20]
insert_sort(alist)
print(alist)
注意
如果比较操作的代价比交换操作大的话,可以采用二分查找法来减少比较操作的数目。该算法可以认为是插入排序的一个变种,称为二分查找插入排序。