python算法9.7——二分法插入排序

前提:二分法查找

# 二分法查找,又称对半查找,是一种较为高效的简单查找方法,且要求元素采用顺序存储结构
# 原理:
# 1.查找指定元素是否在前半部分序列,不在则查找是否在后半部分序列
# 2.若元素在序列中,则将序列再次分割,重复1
# 3.知道找到满足条件的记录,后者子序列不存在,即不包含元素

import random
Range = 10
Length = 5
dst = 5
flag = 0

list = random.sample(range(Range),Length)    #在指定序列中随机获取指定长度片段
list.sort()
print('sorted list:',list)

low = 0
high = Length-1

while low<=high:
    mid = (low+high)//2
    if list[mid] == dst:
        flag = 1
        break
    elif list[mid] > dst:
        high = mid - 1
    elif list[mid] < dst:
        low = mid + 1

if flag:
    print('5在第',mid+1,'位')
else:
    print("错误查询")


二分法插入排序

# 二分法插入排序是在插入排序的基础上,使用二分法查找将元素插入的方法
# 基本原理:(升序)
# 1.将元素依次放入有序序列中
# 2.取出待排序元素,与有序序列的前半段进行比较
# 3.缩小有序序列范围,进一步划分比较,直至范围内仅有1或2个数字
# 4.将插入值与范围进行比较
# 3.重复实现升序
# 实现过程:外层循环控制循环次数,中层循环实现有序排列,内层循环实现查找插入
import random

# 生成序列
Range = 10
Length = 5
list = random.sample(range(Range),Length)
print('before sort:',list)

# 元素插入
for i in range(1,Length):            #从第2个元素开始,插入到前一部分元素中
    beg,end = 0,i-1                  #定义插入范围
    mid = (beg + end) // 2           #定义二分/中间边界

    while beg < end:                #当边界顺序时,进行二分比较
        mid = (beg + end) // 2
        if mid == beg:               #如果中间值与边界相等,则边界已确定,结束二分
            break
        #在确定中间与边界不相等时,对边界继续缩小
        if list[i] == list[mid]:
            break
        elif list[i]<list[mid]:
            end = mid
        else:
            beg = mid

    #首先确定是否因为找到同值而提前终止
    if list[i] == list[mid]:
        list.insert(mid, list[i])
        list.pop(i + 1)
    else:
        if beg == end:              #如果范围内仅仅有一个值
            if list[i] < list[beg]:
                list.insert(beg,list[i])
            else:
                list.insert(beg+1, list[i])
            list.pop(i + 1)
        elif beg < end:             #如果范围内有两值
            if list[i] < list[beg]:
                list.insert(beg,list[i])
            elif list[i] < list[end]:
                list.insert(end, list[i])
            else:
                list.insert(end+1, list[i])
            list.pop(i + 1)
        else:
            print("wrong, start at ",beg,', and end with ',end)

print('after sort:',list)

二分插入排序的原理较为简单,但是二分边界的确定以及范围比较的实现较为繁琐

猜你喜欢

转载自blog.csdn.net/nominior/article/details/82504055
今日推荐