二分插入排序法-Python版

简介:

传统的插入法思想为:

1.从头开始,构建有序数列;

2.再将之后需要排序的数据从头至尾(或从尾至头)进行比较,插入到其相应的位置。

而二分插入排序法第一步与传统插入法相同,第二步而是采用二分查询的原理,一半一半去缩小需要寻找插入的位置使插入的最大循环步骤从n-1缩小至log2(n),对于大量数据的排序,相较于插入法速度可提升70%左右。

 

代码如下:

import math
import time
import random

list_a=[random.randint(0,10000) for i in range(10000) ]
# list_a=[random.randint(0,9) for i in range(100000) ]
# list_a=[5,1,7,9,8,6,2,4,3]
start_t=time.time()
print('开始时间:',start_t)
for i in range(1,len(list_a)):
    temp=list_a[i]
    # 阶段性初始化最大最小和中间值
    min = 0
    max = i - 1
    mid = int((max + min) / 2)
    while True:
        if temp<=list_a[0]:  # 待插入数据和头数据比较
            for j in range(i,0,-1):
                list_a[j]=list_a[j-1]
            list_a[min]=temp
            break
        if temp>=list_a[i-1]:  # 待插入数据和尾数据比较
            break
        if max-min==1: # 插入位置终结条件,最大和最小值序号差值为1
            for j in range(i,max,-1):
                list_a[j] = list_a[j - 1]
            list_a[max] = temp
            break
        if temp>list_a[mid]: # 插入值比中间值大时,重置中间值和最小值
            min=mid
            mid=int((min+max)/2)
        elif temp<list_a[mid]: # 插入值比中间值小时,重置中间值和最大值
            max=mid
            mid=int((min+max)/2)
        elif temp==list_a[mid]: # 插入值和中间值相等时,终止查询,执行插入
            for j in range(i,mid,-1):
                list_a[j] = list_a[j - 1]
            list_a[mid] = temp
            break
print(list_a)
end_t=time.time()
print('结束事件时间:',end_t)
print('耗时:',end_t-start_t)

 

PS:

由于示例需要展示运算过程并以便转换为其它代码,本例并未使用如insert等Python专有函数。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值