插入排序
python实现
原理
逐个元素排查,第一个元素默认已排序,从第二个元素开始,比较当前元素与前一个元素的大小,前一个元素大于当前元素,则交换两个元素位置,交换后再用已经交换到前一个位置的当前元素与现位置的前一个元素比较,直到无需交换,进入下一个元素,以此类推,遍历完所有位置的元素。
运行时间
最坏:原数组完全逆序
Ω(n^2)
最好:原数组已基本排序或完全排序
O(n)
实现
精简
import copy
import time
# 插入排序法
def insert_func(obj):
"""
排序中不写入当前值,每轮最后写入
"""
for i in range(1, len(obj)):
current = obj[i]
j = i
while j > 0 and obj[j - 1] > current:
obj[j] = obj[j - 1]
j -= 1
obj[j] = current
加打印版
import copy
import time
# 插入排序法
def insert1(obj):
"""
排序中不写入当前值,每轮最后写入
:param obj: 未排序数组
:return: obj: 排序后数组
"""
t1 = time.time()
print("未排序之前数组:{}".format(obj))
for i in range(1, len(obj)):
current = obj[i]
print("当前排序数:{}".format(current))
j = i
while j > 0 and obj[j - 1] > current:
obj[j] = obj[j - 1]
print("本轮排序中:{}".format(obj))
j -= 1
obj[j] = current
print("本轮排序完:{}".format(obj))
print("最终排序结果:{}".format(obj))
t2 = time.time()
print("time:%s" % (t2-t1))
return obj
def insert2(obj):
"""
排序中直接与前一位交换,在前一位写入当前值
:param obj: 未排序数组
:return: obj: 排序后数组
"""
t1 = time.time()
print("未排序之前数组:{}".format(obj))
for i in range(1, len(obj)):
print("当前排序数:{}".format(obj[i]))
j = i
while j > 0 and obj[j - 1] > obj[j]:
obj[j], obj[j - 1] = obj[j - 1], obj[j]
print("本轮排序中:{}".format(obj))
j -= 1
print("本轮排序完:{}".format(obj))
print("最终排序结果:{}".format(obj))
t2 = time.time()
print("time:%s" % (t2-t1))
return obj
if __name__ == '__main__':
li = [3, 1, 4, 7, 2, 8, 6, 5]
lii = copy.deepcopy(li)
insert1(li)
print("*"*20)
insert2(lii)
倒序排序
将>换为<
def insert_func(obj):
"""
排序中不写入当前值,每轮最后写入
"""
for i in range(1, len(obj)):
current = obj[i]
j = i
while j > 0 and obj[j - 1] < current:
obj[j] = obj[j - 1]
j -= 1
obj[j] = current
来源:CSDN
作者:freecatling
链接:https://blog.csdn.net/freecatling/article/details/104759489