在一个有序列表里按照原排序插入一个值 是一道常见面试题。
这道题一般的解法是判断出有序列表的排列规则后,基于位置进行遍历,在找到符合条件的位置进行插入。用到的api有sorted、insert。这个是不考虑算法的解法,假如L的数值特别多,而恰巧要插入的值又比较靠后,那么就会比较耗时。
然后我就想能不能利用二分法进行插入,代码行数增加了,但是耗时会大大的减少。代码如下:
def insert_num(L,n): #此代码只写了正序,倒序的只要反过来写就可以,或者进行反转即可复用此代码,最后return再次反转的列表
if sorted(L)==L:
if L[0]>=n: #如果列表第一个值大于或等于n,则直接插入到第一位
L.insert(0,n)
elif L[len(L)-1]<=n: #如果n大于或等于列表第一个值,则直接插入到最后一位
L.insert(len(L)-1,n)
else: #否则
min=0
max=len(L) #此处取len(L)或者len(L)-1均可,mid取值时做对应的调整即可
while True:
mid=int((min+max)//2)
#print(mid)
if L[mid]<=n and L[mid+1]>=n:
L.insert(mid+1,n)
break
if L[mid]>n:
max=mid
if L[mid]<n :
min=mid
return L