文章目录

  • 二分查找
  • 线性查找
  • 插入排序
  • 快速排序
  • 选择排序
  • 冒泡排序
  • 归并排序
  • 堆排序
    • 推荐代码一
    • 推荐代码二
  • 希尔排序
  • 拓扑排序

说明:本篇博文的知识点大部分来自 Python3 实例

二分查找

二分搜索是一种在有序数组中查找某一特定元素的搜索算法。
这种搜索算法每一次比较都使搜索范围缩小一半。
二分查找有一个特定条件,对于有序且从小到大排列的容器才能使用

这是从菜鸟教程里面截取的一张图,很好的解释了二分查找。

输入数值为4,一半是第五位:7,小于7,在前半部分。再一半取得第二位:3,大于3,在3之后的半部分里面,这样一直二分,直到查找到最终结果。


def binarySearch(lst2, fst, len1, num1):if len1 >= fst:mid = int(fst + (len1 - fst) / 2)if lst2[mid] == num1:return midelif lst2[mid] > num1:return binarySearch(lst2, fst, mid - 1, num1)else:return binarySearch(lst2, mid + 1, len1, num1)else:return -1lst1 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]rst = binarySearch(lst1, 0, len(lst1) - 1, 8)if rst != -1:print("元素在列表中的索引为 ", rst)
else:print("元素不在数组中")

运行结果:

线性查找

线性查找指按一定的顺序检查数组中每一个元素,直到找到所要寻找的特定值为止。

这是从菜鸟教程里面截取的一张图,很好的解释了二分查找。


我个人觉得这个就是常用的变量,没什么特别的。
上代码:


lst2 = [2, 3, 4, 5, 6, 7, 8, 9]def search(lst3, len3, num3):for idx in range(0, len3):if lst3[idx] == num3:return idxreturn -1num2 = 6
rst2 = search(lst2, len(lst2), num2)if rst2 != -1:print("元素在数组中的索引为", rst2)
else:print("元素不在数组中")

运行结果:

插入排序

插入排序是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
Python 插入排序
插入排序大家进入这个网址取看吧。主要他的那个动图很有形象。弄不过来。

这张图,可以去网址里面看看它的实现逻辑。Python 插入排序

上代码:


def insertionSort(lst5):for idx1 in range(1, len(lst5)):key = lst5[idx1]idx2 = idx1 - 1while idx2 >= 0 and key < lst5[idx2]:lst5[idx2 + 1] = lst5[idx2]idx2 -= 1lst5[idx2 + 1] = keylst4 = [12, 11, 13, 5, 6, 234, 1]
insertionSort(lst4)
print("排序后的数组:")
for i in range(len(lst4)):print("%d" % lst4[i])

运行结果:

快速排序

快速排序使用分治法策略来把一个序列分为较小和较大的2个子序列,然后递归地排序两个子序列。


def partition(lst03, low, high):idx1 = (low - 1)pivot = lst03[high]for j in range(low, high):if lst03[j] <= pivot:idx1 = idx1 + 1lst03[idx1], lst03[j] = lst03[j], lst03[idx1]lst03[idx1 + 1], lst03[high] = lst03[high], lst03[idx1 + 1]return idx1 + 1def quickSort(lst02, low, high):if low < high:pi = partition(lst02, low, high)quickSort(lst02, low, pi - 1)quickSort(lst02, pi + 1, high)lst01 = [10, 7, 8, 9, 1, 5]
quickSort(lst01, 0, len(lst01) - 1)
print("排序后的数组:")
for i in range(len(lst01)):print("lst01[{idx}] = {val}".format(idx=i, val=lst01[i]))

运行结果:

选择排序

选择排序是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

这也是从菜鸟教程里面截取的一张图:

这张图,可以去网址里面看看它的实现逻辑。Python 选择排序


lst03 = [64, 25, 12, 22, 11, 35, 2, 9, 123]for i in range(len(lst03)):minIdx = ifor j in range(i + 1, len(lst03)):if lst03[minIdx] > lst03[j]:minIdx = jlst03[i], lst03[minIdx] = lst03[minIdx], lst03[i]print("排序后的数组:")
for i in range(len(lst03)):print("lst03[{idx}] = {val}".format(idx=i, val=lst03[i]))

运行结果:

冒泡排序

冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。


这张图,可以去网址里面看看它的实现逻辑。Python 冒泡排序

代码:


lst04 = [23, 64, 25, 11, 76, 12, 22]def bubbleSort(lst05):n = len(lst05)for idx1 in range(n):for idx2 in range(0, n - idx1 - 1):if lst05[idx2] > lst05[idx2 + 1]:lst05[idx2], lst05[idx2 + 1] = lst05[idx2 + 1], lst05[idx2]bubbleSort(lst04)print("排序后的数组:")
for i in range(len(lst04)):print("lst04[{idx}] = {val}".format(idx=i, val=lst04[i]))

运行结果:

归并排序

归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

分治法:

分割:递归地把当前序列平均分割成两半。
集成:在保持元素顺序的同时将上一步得到的子序列集成到一起(归并)。

这是归并排序的动图示例:

我这里的图不会动,想看动图示例到这里看:Python 归并排序
大家可以查看这个网址,有图例展示归并排序的过程。
Python 归并排序


def merge(arr, l, m, r):n1 = m - l + 1n2 = r - mL = [0] * (n1)R = [0] * (n2)for i in range(0, n1):L[i] = arr[l + i]for j in range(0, n2):R[j] = arr[m + 1 + j]i = 0j = 0k = lwhile i < n1 and j < n2:if L[i] <= R[j]:arr[k] = L[i]i += 1else:arr[k] = R[j]j += 1k += 1while i < n1:arr[k] = L[i]i += 1k += 1while j < n2:arr[k] = R[j]j += 1k += 1def mergeSort(arr, l, r):if l < r:m = int((l + (r - 1)) / 2)mergeSort(arr, l, m)mergeSort(arr, m + 1, r)merge(arr, l, m, r)arr = [12, 11, 13, 5, 6, 7, 9, 234, 23, 123, 45]
n = len(arr)
print("给定的数组")
for i in range(n):print("%d" % arr[i]),mergeSort(arr, 0, n - 1)
print("\n\n排序后的数组")
for i in range(n):print("%d" % arr[i])

运行结果:

堆排序

堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。
示意图:

可以看这里,查看动态堆排序示意图:
Python 堆排序

推荐代码一


def OneHeapSort(list1, l, r):if r - l <= 0:returnif r - l == 1 and list1[l] > list1[r]:list1[l], list1[r] = list1[r], list1[l]else:middle = l + (r - l - 1) // 2OneHeapSort(list1, l, middle)OneHeapSort(list1, middle + 1, r - 1)if list1[middle] > list1[r]:list1[middle], list1[r] = list1[r], list1[middle]if list1[r - 1] > list1[r]:list1[r - 1], list1[r] = list1[r], list1[r - 1]# 依次将最大值放到数组的后面
def heapSort(list):for i in range(len(list) - 1, 0, -1):OneHeapSort(list, 0, i)list1 = [12, 11, 13, 5, 6, 7, 9, 234, 23, 123, 45]
heapSort(list1)
print(list1)

运行结果:

推荐代码二


def heapify(arr):n = len(arr)for i in reversed(range(n // 2)):shiftDown(arr, n, i)def shiftDown(arr, n, k):while 2 * k + 1 < n:j = 2 * k + 1if j + 1 < n and arr[j + 1] < arr[j]:j += 1if arr[k] <= arr[j]:breakarr[k], arr[j] = arr[j], arr[k]k = jdef shiftDown2(arr, n, k):smallest, l, r = k, 2 * k + 1, 2 * k + 2while l < n:if arr[l] < arr[smallest]:smallest = lif r < n and arr[r] < arr[smallest]:smallest = rif smallest == k:breakelse:arr[k], arr[smallest] = arr[smallest], arr[k]k = smallestl, r = 2 * k + 1, 2 * k + 2def heapSort(arr):n = len(arr)heapify(arr)print("堆化:", arr)for i in range(n - 1):arr[n - i - 1], arr[0] = arr[0], arr[n - i - 1]# print("交换最小值后:",arr)shiftDown(arr, n - i - 1, 0)# print("调整后:",arr)arr = [12, 11, 13, 5, 6, 7, 9, 234, 23, 123, 45]
heapSort(arr)
print("排序后:", arr)

运行结果:

这两种方式有不同特点,还是挺易于理解的。

·
·
·

希尔排序

大家可以参考这里:
Python 希尔排序

拓扑排序

大家可以参考这里:
Python 拓扑排序

python学习-综合练习七(二分查找(递归)、线性查找、插入排序、快速排序、选择排序、冒泡排序、归并排序、堆排序)-实例相关推荐

  1. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

  2. 插入排序、选择排序、快速排序以及归并排序(附Python代码)

    排序算法基本原理以及复杂度等知识点可跳转至该博客了解https://www.cnblogs.com/onepixel/p/7674659.html ,本博客主要对排序算法性能进行对比以及记录对比过程发 ...

  3. python学习-综合练习六(列表翻转、变量交换、复制列表、元素求和(lambda和递归)、字典排序、字典pop)

    文章目录 列表翻转 变量交换 复制列表 元素求和 字典排序 字典pop 说明:本篇博文的知识点大部分来自 Python3 实例 列表翻转 列表翻转就是把列表的值按顺序左移,逻辑还是挺简单的. 我之前的 ...

  4. 前阿里大佬干货分享,0基础小白,转行必看Python学习笔记(七)

    Python学习笔记7 异常处理 包和模块 包和模块的一般操作 导入操作的本质 模块检索的路径 导入模块的场景 第三方包和模块的安装 异常处理 系统内部一开始已经内置了一些特定的错误场景,当我们触发了 ...

  5. Python学习,第七课(灵活使用Frame,让布局更舒适)

    Python学习第七课(让界面布局舒适,是一个长久的工作) 一入布局深似海,加一减一都很难 基础知识 尝试布局 尝试好布局,感受下元素带来的不同 改造主程序,细节还是要优化 细节优化,细枝末节的参数 ...

  6. 计算机二级Python学习笔记(七)

    上一篇:计算机二级Python学习笔记(六) 第7章 文件和数据格式化 7.1 文件的使用 文件:数据的集合和抽象,存储在辅助存储器上的一组数据序列,可以包含任何数据内容. 文件类型:文本文件(由单一 ...

  7. python学习笔记(七)类和面向对象

    目录 (一)了解面向对象 面向过程 面向对象的三大特性: (二)python中的类 1)定义类 新式类与经典类 2)初始化与实例化 3)类的属性 类属性与实例属性 私有属性 特殊属性 同名的类属性与实 ...

  8. 选择排序 冒泡排序 二分查找

    选择排序 int [] arr = {2,48,28,32,90,12}; for(int i= 0: i < arr.length - 1;i++){ for(int j = i + 1; j ...

  9. 我的Java学习之路(第十九天)------ 数组的复制、反转、查找(线性查找、二分法)

    (参考:尚硅谷_宋红康_Java语言基础) 文章目录 数组的复制 数组的反转 数组的查找 线性查找 二分法查找 数组的复制 假定两个数组arr1与arr2,如果使用arr2 = arr1,但是这个并不 ...

最新文章

  1. CSS、JavaScript、PHP和Python编程合二为一
  2. 客户机不能看到分配的dhcp_交换机配置DHCP后下挂用户获取不到IP地址或者获取缓慢...
  3. numpy meshgrid用法
  4. Python技术学习之Django框架设计思想
  5. agv机器人托举结构_AGV机器人常见减震浮动结构对比分析
  6. 小米(红米)手机查看生产日期和启用日期
  7. js获取浏览器语言(ie、ff、chrome)、contextpath
  8. 统计字符串元素出现的个数_LeetCode 1295. 统计位数为偶数的数字
  9. QThread(一)
  10. 迁徙数据平台简单介绍
  11. 通信基站中AAU与RRU的功能和区别是什么?
  12. “三色鸽杯”南阳市第四届十大新闻人物揭晓
  13. DHCP 协议及其交互过程
  14. 罗技计算机配置存入板载内存,板载内存 没有驱动也能自定义_鼠标_键鼠导购-中关村在线...
  15. 钻井液中PHP是指什么,钻井液是什么?关于钻井液的详细介绍
  16. 查看计算机的主要自启动项,怎么查看开机启动项
  17. 华为云设计语言_Java程序设计教程——基于华为云DevCloud
  18. go-pitaya学习笔记(6)-cluster-protobuf demo分析
  19. 用Android打出马奔跑的动画,奔跑彩虹马百变版手机
  20. java语言程序设计第二版课后答案吴倩_Java语言程序设计

热门文章

  1. 如何理解 SAP UI5 的 sap.ui.define 函数
  2. 将 Observable.pipe 的输入参数手动分解
  3. SAP UI5 数据绑定之高级技巧 - Type System
  4. SAP Spartacus全局配置模块里和layoutSlot相关的配置
  5. SAP Spartacus取语言设置的入口程序
  6. Java Spring里getBean方法的实现
  7. Gradle中依赖任务产生的不同输出
  8. 使用OData服务创建SAP C4C的Lead数据,必须指定Account字段
  9. SAP CRM WebClient UI交互式报表的Gross Value工作原理
  10. ng-controller and ng-model的工作原理