在一个有序序列(从小到大)中查找一个元素

每次将元素与序列中间位置的元素进行比较

如果大于中点,则在后半段。如果小于中点,则在前半段。以此类推

时间复杂度为O(logn)

有一个无序序列[37, 99, 73, 48, 47, 40, 40, 25, 99, 51],对其先排序输出新列表。

分别插入20、40、41、100到这个新序列中合适的位置,保证其有序。

origin = [37, 99, 73, 48, 47, 40, 40, 25, 99, 51]

origin = sorted(origin)
# print(origin)
# [25, 37, 40, 40, 47, 48, 51, 73, 99, 99] # 有重复时从左边插入
def insert_sort(origin:list, num):
low = 0
high = len(origin)
while low < high:
mid = (low + high)//2
# 如果大于中点,则在后半部分
if num > origin[mid]:
low = mid + 1
# 否则在前半部分
else:
high = mid
origin.insert(low, num) for num in (20, 40, 41, 100):
insert_sort(origin, num) print(origin)
# [20, 25, 37, 40, 40, 40, 41, 47, 48, 51, 73, 99, 99, 100]
origin = [37, 99, 73, 48, 47, 40, 40, 25, 99, 51]

origin = sorted(origin)

# 有重复时从右边插入
def insert_sort(origin:list, num):
low = 0
high = len(origin)
while low < high:
mid = (low + high)//2
if num < origin[mid]:
high = mid
else:
low = mid + 1
origin.insert(low, num) for num in (20, 40, 41, 100):
insert_sort(origin, num) print(origin)
# [20, 25, 37, 40, 40, 40, 41, 47, 48, 51, 73, 99, 99, 100]

bisect模块

bisect包含两个主要函数 bisect和insort,都是基于二分法实现

  • bisect: bisect_right的别名,返回插入点位置,有重复时返回右边插入点
  • bisect_left: 返回插入点位置,有重复时返回左边插入点
  • insort: insort_right的别名,默认有重复时从右边插入
  • insort_left: 有重复时从左边插入
import bisect

origin = [37, 99, 73, 48, 47, 40, 40, 25, 99, 51]
origin = sorted(origin) for num in (20, 40, 41, 100):
bisect.insort_left(origin, num) print(origin)
# [20, 25, 37, 40, 40, 40, 41, 47, 48, 51, 73, 99, 99, 100]

判断学生成绩,成绩等级A-E,其中,90分以上为A,80-89为B,70-79为C,60-69为D,50-59为E

breakpoints = [60, 70, 80, 90]
grades = 'EDCBA' index = bisect.bisect(breakpoints, 55)
print(grades[index])
# E

参考:

https://zh.wikipedia.org/wiki/二分搜索算法

https://docs.python.org/3/library/bisect.html

二分插入、bisect的更多相关文章

  1. 使用bisect库实现二分查找

    手动实现 假如有一个有序表nums,怎么样在nums里找到某个值的位置呢?没错,就是nums.index(k),哈哈哈哈哈哈哈-- 假如nums很长很长,那就要祭出二分查找了 def binary_s ...

  2. 查找问题的利器 - Git Bisect

    原文:http://gitbook.liuhui998.com/5_4.html 假设你在项目的'2.6.18'版上面工作, 但是你当前的代码(master)崩溃(crash)了. 有时解决这种问题的 ...

  3. Python模块——bisect

    bisect是python内置的模块,主要用于对有序列进行操作.具体用法如下: 模块导入:import bisect 内容查看:dir(bisect) 这个模块包含了: 五个变量:builtins, ...

  4. 每日一“酷”之bisect

    作用:维护有序列表,而不必在每次想列表增加一个元素时调用sort排序 bisect 模块实现了一个算法用于向列表中插入元素,同时仍保持列表有序.有些情况下,这比反复对一个了表序列更高效,另外也比构建一 ...

  5. python bisect模块

    转发:http://www.cnblogs.com/skydesign/archive/2011/09/02/2163592.html 先看看模块的结构: 前面五个属性大家感兴趣可以打出来看看数值,这 ...

  6. [Practical Git] Diagnose which commit broke something with git bisect

    Sometimes you find a bug in your project that has been around for a while without being noticed; it ...

  7. python标准库 bisect模块

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #bisect #作用:维护有序列表,而不必在每次向列表增加一个元素 ...

  8. python笔记之bisect模块

    python笔记之bisect模块 当你决定使用二分搜索时,这个模块会给你带来很大的帮助. 例子 import bisect L = [1,3,3,6,8,12,15] x = 3 #在L中查找x,x ...

  9. python数组查找算法---bisect二分查找插入

    1 实例 这个模块只有几个函数, 一旦决定使用二分搜索时,立马要想到使用这个模块 [python] view plaincopyprint? import bisect L = [1,3,3,6,8, ...

随机推荐

  1. 发布了一个基于jieba分词的ElasticSearch插件

    github地址: https://github.com/hongfuli/elasticsearch-analysis-jieba 基于 jieba 的 elasticsearch 中文分词插件. ...

  2. 因写太多 BUG!程序员遭公司颁奖羞辱,做的一个比一个绝​

    刚入职的程序员新人,办公桌上,基本上也就一电脑.一键盘.一鼠标,再配个被杯子.然而混迹职场多年的猿老们,办公桌上都有一些彰显身份地位的“好东西”. 这张图两点颇多,最显眼的,是办公桌上那个黄黄的东西, ...

  3. item 12: 把重写函数声明为“override”的

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 C++中的面向对象编程总是围绕着类,继承,以及虚函数.这个世界中, ...

  4. SQL行转列汇总 (转)

    PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )A ...

  5. Visual Studio的安装与单元测试

    一.Visual Studio的安装 由于上学期重装了win10系统,以前使用的vc++6.0不能够正常使用,所以直接就安装了Visual Studio 2015,安装的时候就直接按照提示的步骤进行安 ...

  6. python语言几个常见函数的使用

    写代码,有如下变量,请按照要求实现每个功能: name = " Kobe Bean Bryant" a. 移除 name 变量对应的值左边的空格,并输出移除后的内容 name = ...

  7. java计算器项目

    简单的java计算器项目   题目:java计算器项目 一. 题目简介: 一个能进行加减乘除四则运算的小程序 Github链接:https://github.com/lizhenbin/test/tr ...

  8. Filter学习:项目第八阶段

      public interface Filter A filter is an object that performs filtering tasks on either the request ...

  9. maven配置私服

    1先配置maven的配置文件 2在项目的pom.xml文件增加 <distributionManagement> <repository> <id>nexus-re ...

  10. git 使用ssh密钥

    一.查看仓库支持的传输协议 1.1查看仓库支持的传输协议 使用命令 git remote -v 查看你当前的 remote url root@zengyue:/home/yuanGit# git re ...