""" 插入排序 """
import timeit
""" 自己瞎想的实现 """
def insert_sort(unorder_list):
""" 插入排序 """
# 存放已经排好序的数据
order_lis = []
for i, elem in enumerate(unorder_list):
if not order_lis:
# 如果是第一次插入,首先将原数组的第一个数据插入到已排序列表
order_lis.append(elem)
else:
for j, order_elem in enumerate(reversed(order_lis)):
# 得到反序的已排序列表数据
if elem >= order_elem:
# 如果待插入的数据大于等于已排序的数据,说明此时把该数据放在此处正好合适(升序)
# print('j:%d--elem:%d---ord:%d'%(j, elem, order_elem))
# print(order_lis)
#
order_lis.insert(len(order_lis)-j, elem)
break
# 如果整个列表都不存在待排序数据大于已排序数据情况,说明待排序的这个数据此时最小,插入最前面
else:
order_lis.insert(0, elem)
return order_lis
""" 其他比较好的实现: 原文链接:---找不着了,转自博客园, 手关的太快了。
反正挺多的,内容大同小异"""
def insertionSort(a):
for i in range(1, len(a)):
# value是待排序元素
value = a[i]
insert_index = -1
for j in range(i-1, -1, -1):
if value < a[j]:
# 如果待排序元素小于已排序元素j,那么已排序元素j就要后移一位
# 表现则是已排序元素j的索引加1
# 待排序元素的索引变成j
# 待排序元素和所有已排序元素比较完一轮后,已排序元素索引该增加的都增加了
# 同时得到一个最终的插入索引j
a[j+1] = a[j]
insert_index = j
# print(a)
if insert_index != -1:
# 把待排序元素赋值到最新得到的插入索引
a[insert_index] = value
return a
if __name__ == '__main__':
test_lis = [12, 56, 82, 36, 94, 102, 86, 95, 35, 66, -5, 899, -86]
timer1 = timeit.Timer("insert_sort(test_lis)", "from __main__ import insert_sort, test_lis")
print("test1:", timer1.timeit(1000))
timer2 = timeit.Timer("insertionSort(test_lis)", "from __main__ import insertionSort, test_lis")
print("test2:", timer2.timeit(1000))
test1: 0.011123999999999995
test2: 0.008207999999999993 ---------- 快太多了