"""
排序与查找
-- 冒泡排序
-- 选择排序
-- 快速排序 --****经典
-- 希尔排序
"""
# 常用排序的实现 # 冒泡排序-每轮排出最大 时间复杂度O(n**2)
def bubble(list_):
if list_: # 非空列表排序
# 外层表示比较轮数
for i in range(len(list_)-1):
# 表示每轮两两比较的次数
for j in range(len(list_)-1-i):
if list_[j] > list_[j+1]:
list_[j],list_[j+1] = list_[j+1],list_[j]
else: # 空列表报异常
raise ValueError # 选择排序
def select_sort(list_):
# 外侧循环n-1轮
for i in range(len(list_)-1):
# 假设list_[i]最小
min = i
for j in range(i+1,len(list_)):
if list_[min] > list_[j]:
# 擂主换人
min = j
#进行交换,将最小值换到应该在的位置
if min != i:
list_[i],list_[min] = list_[min],list_[i] # 插入排序
def insert_sort(list_):
# 外侧循环n-1轮,每次比较的数,从第二个数开始
for i in range(1,len(list_)):
# 空出list_[i]的位置
x = list_[i]
j = i-1
while j >= 0 and list_[j] > x:
list_[j+1] = list_[j]
j -= 1
list_[j +1] = x # 完成一轮交换
def sub_sort(list_,low,high):
# 选定基准
x = list_[low]
# low 向后,high向前
while low < high:
# 后面的数前放
while list_[high] >= x and high > low:
high -= 1
list_[low] = list_[high]
# 前面数后放
while list_[low] < x and low < high:
low += 1
list_[high] = list_[low]
list_[low] = x # 快速排序(升序) # low,high = 0,len(list01)-1
# low表示列表的第一个元素索引,high表示最后一个元素索引
def quick_sort(list_,low,high):
"""
1.取出0号元素,赋值,从列表尾部开始比较,
只要比较出比该值小的,被比较的值放头部,
赋值值放那个移动额位置
2.因第一次比较,分出大于原0号元素和小于0号
元素的两部分数,两部分数分别重复1,2
3.直到比较完,结束
:return:
"""
if low < high:
sub_sort(list_,low,high) #快排的主函数,传入参数为一个列表,左右两端的下标
def QuickSort(list,low,high):
if high > low:
#传入参数,通过Partitions函数,获取k下标值
k = Partitions(list,low,high)
#递归排序列表k下标左侧的列表
QuickSort(list,low,k-1)
# 递归排序列表k下标右侧的列表
QuickSort(list,k+1,high) def Partitions(list,low,high):
left = low
right = high
#将最左侧的值赋值给参考值k
k = list[low]
#当left下标,小于right下标的情况下,此时判断二者移动是否相交,若未相交,则一直循环
while left < right :
#当left对应的值小于k参考值,就一直向右移动
while list[left] <= k:
left += 1
# 当right对应的值大于k参考值,就一直向左移动
while list[right] > k:
right = right - 1
#若移动完,二者仍未相遇则交换下标对应的值
if left < right:
list[left],list[right] = list[right],list[left]
#若移动完,已经相遇,则交换right对应的值和参考值
list[low] = list[right]
list[right] = k
#返回k值
return right # 二分查找(有序数组)
def binary_search(list_,key):
low, high = 0,len(list_)-1
# 判断条件
while low < high:
mid = (low+high) // 2
if list_[mid] < key:
low = mid + 1
elif list_[mid] > key:
high = mid -1
else:
return mid list02 = [1,2,3,4,5,6,7,8,9,10]
print("key index:",binary_search(list02,8)) # list_demo = [6,1,2,7,9,3,4,5,10,8]
# print(list_demo)
# QuickSort(list_demo,0,9)
# print(list_demo) #----------------------------
# if __name__ == "__main__":
# print("-"*30)
# list01 = [5,2,57,12,4,9,40,25,3]
# # bubble(list01)
# #print(list01)
# print(sub_sort(list01,0,8))
# print(list01)

基于python常用排序与查找的更多相关文章

  1. 第四百一十五节,python常用排序算法学习

    第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...

  2. Python常用排序算法

    1.冒泡排序 思路:将左右元素两两相比较,将值小的放在列表的头部,值大的放到列表的尾部 效率:O(n²) def bubble_sort(li): for i in range(len(li)-1): ...

  3. C#常用排序和查找算法

    1.C#堆排序代码 private static void Adjust (int[] list, int i, int m) { int Temp = list[i]; int j = i * 2 ...

  4. 常用排序算法的python实现和性能分析

    常用排序算法的python实现和性能分析 一年一度的换工作高峰又到了,HR大概每天都塞几份简历过来,基本上一天安排两个面试的话,当天就只能加班干活了.趁着面试别人的机会,自己也把一些基础算法和一些面试 ...

  5. Java常用排序算法+程序员必须掌握的8大排序算法+二分法查找法

    Java 常用排序算法/程序员必须掌握的 8大排序算法 本文由网络资料整理转载而来,如有问题,欢迎指正! 分类: 1)插入排序(直接插入排序.希尔排序) 2)交换排序(冒泡排序.快速排序) 3)选择排 ...

  6. Python实现常用排序算法

    Python实现常用排序算法 冒泡排序 思路: 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完 ...

  7. 基于python对B站收藏夹按照视频发布时间进行排序

    基于python对B站收藏夹按照视频发布时间进行排序 前言 在最一开始,我的B站收藏一直是存放在默认收藏夹中,但是随着视频收藏的越来越多,没有分类的视频放在一起,想在众多视频中找到想要的视频非常困难, ...

  8. 基于python的opcode优化和模块按需加载机制研究(学习与个人思路)(原创)

    基于python的opcode优化和模块按需加载机制研究(学习与思考) 姓名:XXX 学校信息:XXX 主用编程语言:python3.5 个人技术博客:http://www.cnblogs.com/M ...

  9. Python学习之路【第二篇】-pyc简介、Python常用的数据类型及其用法和常用运算符

    1.pyc简介 python程序在运行时也有编译过程,编译后会产生.pyc文件.这是一种由python虚拟机执行的二进制文件(字节码),用于保存内存中PyCodeObject,以便加快程序的加载运行. ...

随机推荐

  1. Python实现加密的RAR文件解压(密码已知)

    博主之前在网上找了很多资料,发现rarfile库不能直接调用,需要安装unrar模块,下面将详细介绍整个实现流程. 第一步:安装unrar模块,直接pip install unrar可能会找不到库,需 ...

  2. 系统服务监控指标--load、CPU利用率、磁盘剩余空间、磁盘I/O、内存使用情况等

    介绍 大型互联网企业的背后,依靠的是成千上万台服务器日夜不停的运转,以支撑其业务的运转.宕机对于互联网企业来说,代价是沉重的,轻则影响用户体验,重则直接影响交易,导致交易下跌,并且给企业声誉造成不可挽 ...

  3. JavaScript 伪Ajax请求

    伪Ajax 通过iframe以及form表单,可以实现伪Ajax的方式. 并且它的兼容性是最好的. iframe iframe标签能够获取一个其他页面的文档内容,这说明它内部肯定是发送了一个请求,并且 ...

  4. js学习笔记之作用域链和闭包

    在学习闭包之前我们很有必要先了解什么是作用域链 一.作用域链 作用域链是保证对执行环境有权访问的所有变量和函数的有序访问. 这句话其实还是蛮抽象的,但是通过下面一个例子,我们就能清楚的了解到作用域链了 ...

  5. Git【常见知识点速查】

    文章更新时间:2020/06/17 一.基础知识点解析 Git工作流程 以上包括一些简单而常用的命令,但是先不关心这些,先来了解下面这4个专有名词. Workspace:工作区 Index / Sta ...

  6. springmvc 源码分析(一)-- DisparcherServlet的创建和注册到tomcat

    一. servlet 3.0 的使用 1.1 环境搭建: servlet跟spring没有任何关系,我创建一个servlet可以不依赖spring,现在搭建一个纯的servlet项目,并实现简单的类似 ...

  7. Java基础——克隆

    1.克隆 假设有一个对象object1,在某处又需要一个跟object1一样的实例object2,这两个对象是绝对独立的,不会因为某一个修改另一个随之改变,这样,我们不能直接将对象objec1t的引用 ...

  8. c#后台代码请求访问api接口

    前言:最近公司项目与外部api接口对接较多 ,写下自己的代码总结.介绍两种访问方式(HttpClient.HttpWebRequest) 一.HttpWebRequest 访问Api private ...

  9. 关于 K210 MaixPy 的 I2C 读取设备,搜索不到设备,通信失败的一些原因以及解决方案。

    近来对 amigo 开发期间的遇到 I2C 问题做一下总结. 我们发现有一些 I2C 设备搜索不到,主要原因是 DATA 的信号衰减,也可能是 I2C 的总线被拉住了. 软件层面的问题 例如在实现 A ...

  10. makefile实验三 理解make工作的基本原则

    代码简单,但测试花样多,若能回答对本博客的每个步骤的预期结果,可以说对makefile的基础掌握是扎实的. 一,当前的makefile代码 root@ubuntu:~/Makefile_Test# r ...