有一个无序序列[37,99,73,48,47,40,40,25,99,51],先进行排序打印输出,分别尝试插入20/40/41 数值到序列中合适的位置,保证其有序。

1、for 循环实现

第一种实现,利用嵌套for循环,每次迭代出来的数值进行比较。如果比原表中的数值小,则插入到这个数左面。

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

lst = sorted(lst1)

for x in (20,40,41,100):

i = 0

for i,v in enumerate(lst):

if v > x:

break

lst.insert(i,x)

print(lst)

2、利用二分法实现

排序后二分查找到适当位置插入数值。

排序使用sorted解决,假设升序输出。

查找插入点,使用二分查找完成。

假设全长为n,首先在大致的中点元素开始和待插入的数进行比较,如果大则和右边的区域的中点元素进行比较,如果小则和左边的区域的中点进行比较,以此类推。

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

lst1 = sorted(lst)

def lst_insert(lst1,i):

ret = lst1

# print(ret)

length = len(lst1)

low = 0

while low < length:

mid = length // 2

if ret[mid] < i:

low = mid + 1 #说明i大,右边,限制下限。

else:

length = mid #说明i不大于,左边,限制上限。

ret.insert(low,i)

print(ret)

for x in (40,20,21):

lst_insert(lst1,x)

算法的核心就是折半至重合为止。

3、二分

1)二分的前提是有序,否则不允许。

2)二分的查找算法的时间复杂度是O(log n)

4、Bisect模块

提供的函数有:

bisect.bisect_left(a,x,lo=0,hi=len(a)):

查找在有序列表a中插入x的index。Lo和hi用于指定列表的区间,默认是使用整个列表,如果x已经存在,在其左边插入,返回值为index。

bisect.bisect_right(a,x,lo= 0,hi=len(a))或者bisect.bisect(a,x,lo= 0,hi=len(a))

和bisect_left类似,但如果x已经存在,则在其右边插入。

bisect.insort_left(a,x,lo= 0,hi=len(a))

在有序列表a中插入x,等同于a.insert(bisect.bisect_left(a,x,lo,hi),x).

bisect.insort_right(a,x,lo= 0,hi=len(a))或者bisect.insort(a,x,lo= 0,hi=len(a))和insort_left函数类似,但是如果x如果已经存在,在其右边插入。

函数可以分为两类:

Bisect系,用于查找index。

Insort系,用于实际插入。

默认重复时候从右边插入。

import bisect

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

lst1 = sorted(lst)

print(lst1) #[25, 37, 40, 40, 47, 48, 51, 73, 99, 99]

print(20,bisect.bisect(lst1,20)) #20 0

print(30,bisect.bisect(lst1,30)) #30 1

print(40,bisect.bisect(lst1,40)) # 40 4

print(100,bisect.bisect(lst1,100)) # 100 10

print(20,bisect.bisect_left(lst1,20)) #20 0

print(30,bisect.bisect_left(lst1,30)) #30 1

print(40,bisect.bisect_left(lst1,40)) #40 2

print(100,bisect.bisect_left(lst1,100)) # 100 10

for x in (20,30,40,100):

bisect.insort_left(lst1,x)

print(lst1)

# [20, 25, 37, 40, 40, 47, 48, 51, 73, 99, 99]

# [20, 25, 30, 37, 40, 40, 47, 48, 51, 73, 99, 99]

# [20, 25, 30, 37, 40, 40, 40, 47, 48, 51, 73, 99, 99]

# [20, 25, 30, 37, 40, 40, 40, 47, 48, 51, 73, 99, 99, 100]

5、二分应用

判断学习成绩,成绩等级A-E 。90分以上为A ,80 以上为B ,70以上为C 60以上为D。60以下为D。

def insert_score(nums):

lst = [60, 70, 80, 90]

grades = "EDCBA"

index = bisect.bisect(lst,nums)

print(index)

print(grades[index])

insert_score(70)

python二分法排序_二分法排序-Python实现相关推荐

  1. Python 实例教学_ 04_排序

    Python 实例教程 Python 实例教学_ 04_排序 第十九课 [870. 优势洗牌](https://leetcode.cn/problems/advantage-shuffle/) [90 ...

  2. python set 排序_python set 排序_如何在Python中使用sorted()和sort()

    点击"蓝字"关注我们 ?"Python基础知识" 大卫·丰达科夫斯基  著 18财税3班 李潇潇    译 日期:2019年5月6日 一. 使用sorted() ...

  3. python列表内数字排序_如何在Python中手动排序数字列表?

    规格:Ubuntu 13.04,Python 3.3.1 背景:Python的初学者,遇到了这个"手动排序"的问题. 我被要求做的是:"让用户输入3个数值并将它们存储在3 ...

  4. python operator 多属性排序_快速入门Python必备的基础知识

    本文内容目录: 变量 注释 数据类型 条件判断 循环 函数 模块 数据结构 1.变量 在代码里,我们用变量来存放数据,利用"="为变量赋值. 变量的命名技巧:前半部分能代表数据的意 ...

  5. 二分法排序_二分法排序算法

    #includeintfun(inta[],intn,intkey){intlow,mid,high;//low.mid.high是三个索引分别指向数组的下标low=0;//low指向数组a[]的第一 ...

  6. java二分法排序_二分法排序讲解『附视频』

    二分法排序讲解『附视频』 时间:2017-06-22     来源:华清远见JAVA学院 算法一直是Java编程学习中的重点和难点,今天华清Java学院小编就和大家分享一下Java中的二分法排序. ① ...

  7. python算法描述_数据结构(Python语言描述)- 排序算法

    目录 1.基本排序算法 1.1 选择排序 1.2 冒泡排序 1.3 插入排序 2. 更快排序算法 2.1 快速排序 2.2 归并排序(合并排序) 1.基本排序算法 计算机科学家设计了很多巧妙的策略对列 ...

  8. js数组按中文拼音排序_通俗易懂讲 Python 算法:快速排序

    原文:https://stackabuse.com/quicksort-in-python/ 作者:Marcus Sanatan 译者:老齐 欢迎在 bilibili  搜索 freeCodeCamp ...

  9. python链表排序_链表排序+末尾各种排序

    #工具人排序 def nums_sort(data): if not data: return [] min_data = min(data) max_data = max(data) nums =  ...

  10. python经典排序_经典排序 python实现

    稳定的排序算法:冒泡排序.插入排序.归并排序和基数排序.不是稳定的排序算法:选择排序.快速排序.希尔排序.堆排序. 冒泡 defbobble(arr): length=len(arr)for i in ...

最新文章

  1. 深入学习Redis(3):主从复制
  2. Spring 使用 JSR303自定义校验注解+分组校验
  3. prototype.js 让你更深入的了解javascript的面向对象特性
  4. 一个很好的自学网站~推荐一下
  5. 【转】Azure应用部署方式对比
  6. jumpserver v0.4.0 基于 CenOS7 的安装详解
  7. 20170808上课笔记
  8. .Net控件Telerik全套下载:Telerik Controls 2010 Q2 (附加DLL文件+源码)
  9. android 5.0三星,转自【XDA】安卓(Android 5.0)L主题
  10. idea lib下有jar包但是仍然报错 找不到类
  11. ARouter解析笔记
  12. 通俗理解什么是隐马尔科夫模型(hmm)
  13. python实现直方图规定化
  14. labview 上位机报警提示,报警记录,txt文档存储
  15. 双目测距 BM算法 Python版
  16. rest api是什么_什么是REST API?
  17. 安卓4.4.4安装哪个微信版本_新版微信被网友骂惨了,后悔更新了吗?教你一招迅速回到旧版本...
  18. 移动端开发的兼容适配与性能优化干货分享
  19. 4-1蚁群算法(ACO)原理
  20. IAR OF STM8 Error[Pe095]: array is too large

热门文章

  1. 2011斯坦福大学iOS应用开发教程学习笔记(第一课)MVC.and.Introduction.to.Objective-C
  2. 浅谈DelayQueue
  3. 牛客(中兴捧月)—B-切绳子
  4. Android WebView 调用JS方法获取返回值
  5. Mirai登陆QQ的登陆验证过程
  6. MCAL多核中断配置方法
  7. 四位计算机的原理及其实现
  8. 电话号码中间四位隐藏
  9. 高可用架构之限流降级
  10. iOS系统中判断设备类型