当有序范围内有大量数据时,搜索数据的插入位置将非常耗时。
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基础教程
本文教程操作环境:windows7系统Python 3.9.1,DELL G3电脑。