python插入排序的优化

当有序区间有大量数据时,搜索数据的插入位置会非常耗时。

1、插入排序算法总是从有序区间搜索插入位置,以此为切入点。

2、可以使用二分搜索方法快速确认待插入的位置,所以有一个优化版本的插入排序算法,也叫二分查找插入算法。

实例

definsert_sort2(data_list):
'''
使用二分查找函数确定待插入元素在有序区间的插入位置
'''
count=0#统计循环次数
length=len(data_list)
foriinrange(1,length):#默认第一个位置的元素是已排序区间,因此下标从1开始
print(data_list)
wait_insert_data=data_list[i]##等待插入元素
move_index=i
insert_index,count1=binary_search(data_list[0:i],wait_insert_data)#寻找插入位置
count+=count1#统计循环次数需要加上二分查找的循环次数
whilemove_index>insert_index:#移动元素,直到待插入位置处
count+=1
data_list[move_index]=data_list[move_index-1]
move_index-=1
data_list[insert_index]=wait_insert_data#插入操作
print(data_list)
print(f"总循环次数为{count}")
returndata_list


defbinary_search(data_list,data):
"""
输入:有序列表,和待查找的数据data
输出:data应该在该有序列表的插入位置
count变量纯粹是为了统计循环次数而使用的,实际应用时可去除。
"""
count=0
length=len(data_list)
low=0
high=length-1
##如果给定元素大于等于最后一个元素,则插入最后元素位置的后面
##如果小于第一个元素,则插入位置0
ifdata>=data_list[length-1]:returnlength,0
elifdata<data_list[0]:return0,0
insert_index=0
whilelow<high-1:
count+=1
mid=(low+high)//2#python中的除法结果默认为浮点数取整数部分时使用//
ifdata_list[mid]>data:
high=mid
insert_index=high
else:
low=mid
insert_index=low+1#如果值相同或者值大于mid的值,那么插入位置位于其后面
returninsert_index,count

以上就是python插入排序的优化方法,希望对大家有所帮助。更多Python学习指路:Python基础教程

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。