1. """
  2. 排序与查找
  3. -- 冒泡排序
  4. -- 选择排序
  5. -- 快速排序 --****经典
  6. -- 希尔排序
  7. """
  8. # 常用排序的实现
  9.  
  10. # 冒泡排序-每轮排出最大 时间复杂度O(n**2)
  11. def bubble(list_):
  12. if list_: # 非空列表排序
  13. # 外层表示比较轮数
  14. for i in range(len(list_)-1):
  15. # 表示每轮两两比较的次数
  16. for j in range(len(list_)-1-i):
  17. if list_[j] > list_[j+1]:
  18. list_[j],list_[j+1] = list_[j+1],list_[j]
  19. else: # 空列表报异常
  20. raise ValueError
  21.  
  22. # 选择排序
  23. def select_sort(list_):
  24. # 外侧循环n-1轮
  25. for i in range(len(list_)-1):
  26. # 假设list_[i]最小
  27. min = i
  28. for j in range(i+1,len(list_)):
  29. if list_[min] > list_[j]:
  30. # 擂主换人
  31. min = j
  32. #进行交换,将最小值换到应该在的位置
  33. if min != i:
  34. list_[i],list_[min] = list_[min],list_[i]
  35.  
  36. # 插入排序
  37. def insert_sort(list_):
  38. # 外侧循环n-1轮,每次比较的数,从第二个数开始
  39. for i in range(1,len(list_)):
  40. # 空出list_[i]的位置
  41. x = list_[i]
  42. j = i-1
  43. while j >= 0 and list_[j] > x:
  44. list_[j+1] = list_[j]
  45. j -= 1
  46. list_[j +1] = x
  47.  
  48. # 完成一轮交换
  49. def sub_sort(list_,low,high):
  50. # 选定基准
  51. x = list_[low]
  52. # low 向后,high向前
  53. while low < high:
  54. # 后面的数前放
  55. while list_[high] >= x and high > low:
  56. high -= 1
  57. list_[low] = list_[high]
  58. # 前面数后放
  59. while list_[low] < x and low < high:
  60. low += 1
  61. list_[high] = list_[low]
  62. list_[low] = x
  63.  
  64. # 快速排序(升序) # low,high = 0,len(list01)-1
  65. # low表示列表的第一个元素索引,high表示最后一个元素索引
  66. def quick_sort(list_,low,high):
  67. """
  68. 1.取出0号元素,赋值,从列表尾部开始比较,
  69. 只要比较出比该值小的,被比较的值放头部,
  70. 赋值值放那个移动额位置
  71. 2.因第一次比较,分出大于原0号元素和小于0号
  72. 元素的两部分数,两部分数分别重复1,2
  73. 3.直到比较完,结束
  74. :return:
  75. """
  76. if low < high:
  77. sub_sort(list_,low,high)
  78.  
  79. #快排的主函数,传入参数为一个列表,左右两端的下标
  80. def QuickSort(list,low,high):
  81. if high > low:
  82. #传入参数,通过Partitions函数,获取k下标值
  83. k = Partitions(list,low,high)
  84. #递归排序列表k下标左侧的列表
  85. QuickSort(list,low,k-1)
  86. # 递归排序列表k下标右侧的列表
  87. QuickSort(list,k+1,high)
  88.  
  89. def Partitions(list,low,high):
  90. left = low
  91. right = high
  92. #将最左侧的值赋值给参考值k
  93. k = list[low]
  94. #当left下标,小于right下标的情况下,此时判断二者移动是否相交,若未相交,则一直循环
  95. while left < right :
  96. #当left对应的值小于k参考值,就一直向右移动
  97. while list[left] <= k:
  98. left += 1
  99. # 当right对应的值大于k参考值,就一直向左移动
  100. while list[right] > k:
  101. right = right - 1
  102. #若移动完,二者仍未相遇则交换下标对应的值
  103. if left < right:
  104. list[left],list[right] = list[right],list[left]
  105. #若移动完,已经相遇,则交换right对应的值和参考值
  106. list[low] = list[right]
  107. list[right] = k
  108. #返回k值
  109. return right
  110.  
  111. # 二分查找(有序数组)
  112. def binary_search(list_,key):
  113. low, high = 0,len(list_)-1
  114. # 判断条件
  115. while low < high:
  116. mid = (low+high) // 2
  117. if list_[mid] < key:
  118. low = mid + 1
  119. elif list_[mid] > key:
  120. high = mid -1
  121. else:
  122. return mid
  123.  
  124. list02 = [1,2,3,4,5,6,7,8,9,10]
  125. print("key index:",binary_search(list02,8))
  126.  
  127. # list_demo = [6,1,2,7,9,3,4,5,10,8]
  128. # print(list_demo)
  129. # QuickSort(list_demo,0,9)
  130. # print(list_demo)
  131.  
  132. #----------------------------
  133. # if __name__ == "__main__":
  134. # print("-"*30)
  135. # list01 = [5,2,57,12,4,9,40,25,3]
  136. # # bubble(list01)
  137. # #print(list01)
  138. # print(sub_sort(list01,0,8))
  139. # 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. java 将map转为实体类

    使用反射将map转为对象,如果不使用反射的话需要一个get一个set写起来麻烦,并且不通用,所以写了一个通用的方法将map集合转为对象,直接看代码,注释也都挺清楚的 public static < ...

  2. C/C++ 宏操作小技巧

    Abstract 之前写了一个非常mini的log库(也不算库把,自己瞎jb写的),里面几乎都是宏的实现.这里打算趁热打铁,把自己知道的几下子都贴出来,后续如果有新的收获会更新这个博文. 文笔拙劣,主 ...

  3. 2.1 Spring5源码编译

    一. 准备工作 1. . 编译环境 maven jdk8 idea 2. 编译版本: SpringV5.2.7RELEASE+GradleWapper+jdk1.8.0_131编译 二. 源码下载 g ...

  4. Fork Join 并发任务执行框架

    Fork Join 体现了分而治之 什么是分而治之? 规模为N的问题,如果N<阈值,直接解决,N>阈值,将N分解为K个小规模子问题,子问题互相对立,与原问题形式相同,将子问题的解合并得到原 ...

  5. 【Nginx】冰河又一本超硬核Nginx PDF教程免费开源!!

    写在前面 在 [冰河技术] 微信公众号中的[Nginx]专题,更新了不少文章,有些读者反馈说,在公众号中刷 历史文章不太方便,有时会忘记自己看到哪一篇了,当打开一篇文章时,似乎之前已经看过了, 但就是 ...

  6. 技术解析丨C++元编程之Parser Combinator

    摘要:借助C++的constexpr能力,可以轻而易举的构造Parser Combinator,对用户定义的字符串(User defined literal)释放了巨大的潜力. ## 引子 前不久在C ...

  7. 你还不会ES的CUD吗?

    近端时间在搬砖过程中对es进行了操作,但是对es查询文档不熟悉,所以这两周都在研究es,简略看了<Elasticsearch权威指南>,摸摸鱼又是一天. es是一款基于Lucene的实时分 ...

  8. Spring循环依赖的三种方式

    ​ 引言:循环依赖就是N个类中循环嵌套引用,如果在日常开发中我们用new 对象的方式发生这种循环依赖的话程序会在运行时一直循环调用,直至内存溢出报错.下面说一下Spring是如果解决循环依赖的. 第一 ...

  9. Java随谈(一)魔术数字、常量和枚举

    本文适合对 Java 或 C 有一些了解的用户阅读,推荐阅读时间15分钟. 导言 写这个系列的原因? 我曾经听过一种说法,如果不了解Liunx的网络通讯,就很难理解理解Java的IO:如果不知道Jav ...

  10. l洛谷 P6030 [SDOI2012]走迷宫 概率与期望+高斯消元

    题目描述 传送门 分析 首先判掉 \(INF\) 的情况 第一种情况就是不能从 \(s\) 走到 \(t\) 第二种情况就是从 \(s\) 出发走到了出度为 \(0\) 的点,这样就再也走不到 \(t ...