python学习-综合练习七(二分查找(递归)、线性查找、插入排序、快速排序、选择排序、冒泡排序、归并排序、堆排序)-实例
文章目录
- 二分查找
- 线性查找
- 插入排序
- 快速排序
- 选择排序
- 冒泡排序
- 归并排序
- 堆排序
- 推荐代码一
- 推荐代码二
- 希尔排序
- 拓扑排序
说明:本篇博文的知识点大部分来自 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学习-综合练习七(二分查找(递归)、线性查找、插入排序、快速排序、选择排序、冒泡排序、归并排序、堆排序)-实例相关推荐
- C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】
目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...
- 插入排序、选择排序、快速排序以及归并排序(附Python代码)
排序算法基本原理以及复杂度等知识点可跳转至该博客了解https://www.cnblogs.com/onepixel/p/7674659.html ,本博客主要对排序算法性能进行对比以及记录对比过程发 ...
- python学习-综合练习六(列表翻转、变量交换、复制列表、元素求和(lambda和递归)、字典排序、字典pop)
文章目录 列表翻转 变量交换 复制列表 元素求和 字典排序 字典pop 说明:本篇博文的知识点大部分来自 Python3 实例 列表翻转 列表翻转就是把列表的值按顺序左移,逻辑还是挺简单的. 我之前的 ...
- 前阿里大佬干货分享,0基础小白,转行必看Python学习笔记(七)
Python学习笔记7 异常处理 包和模块 包和模块的一般操作 导入操作的本质 模块检索的路径 导入模块的场景 第三方包和模块的安装 异常处理 系统内部一开始已经内置了一些特定的错误场景,当我们触发了 ...
- Python学习,第七课(灵活使用Frame,让布局更舒适)
Python学习第七课(让界面布局舒适,是一个长久的工作) 一入布局深似海,加一减一都很难 基础知识 尝试布局 尝试好布局,感受下元素带来的不同 改造主程序,细节还是要优化 细节优化,细枝末节的参数 ...
- 计算机二级Python学习笔记(七)
上一篇:计算机二级Python学习笔记(六) 第7章 文件和数据格式化 7.1 文件的使用 文件:数据的集合和抽象,存储在辅助存储器上的一组数据序列,可以包含任何数据内容. 文件类型:文本文件(由单一 ...
- python学习笔记(七)类和面向对象
目录 (一)了解面向对象 面向过程 面向对象的三大特性: (二)python中的类 1)定义类 新式类与经典类 2)初始化与实例化 3)类的属性 类属性与实例属性 私有属性 特殊属性 同名的类属性与实 ...
- 选择排序 冒泡排序 二分查找
选择排序 int [] arr = {2,48,28,32,90,12}; for(int i= 0: i < arr.length - 1;i++){ for(int j = i + 1; j ...
- 我的Java学习之路(第十九天)------ 数组的复制、反转、查找(线性查找、二分法)
(参考:尚硅谷_宋红康_Java语言基础) 文章目录 数组的复制 数组的反转 数组的查找 线性查找 二分法查找 数组的复制 假定两个数组arr1与arr2,如果使用arr2 = arr1,但是这个并不 ...
最新文章
- CSS、JavaScript、PHP和Python编程合二为一
- 客户机不能看到分配的dhcp_交换机配置DHCP后下挂用户获取不到IP地址或者获取缓慢...
- numpy meshgrid用法
- Python技术学习之Django框架设计思想
- agv机器人托举结构_AGV机器人常见减震浮动结构对比分析
- 小米(红米)手机查看生产日期和启用日期
- js获取浏览器语言(ie、ff、chrome)、contextpath
- 统计字符串元素出现的个数_LeetCode 1295. 统计位数为偶数的数字
- QThread(一)
- 迁徙数据平台简单介绍
- 通信基站中AAU与RRU的功能和区别是什么?
- “三色鸽杯”南阳市第四届十大新闻人物揭晓
- DHCP 协议及其交互过程
- 罗技计算机配置存入板载内存,板载内存 没有驱动也能自定义_鼠标_键鼠导购-中关村在线...
- 钻井液中PHP是指什么,钻井液是什么?关于钻井液的详细介绍
- 查看计算机的主要自启动项,怎么查看开机启动项
- 华为云设计语言_Java程序设计教程——基于华为云DevCloud
- go-pitaya学习笔记(6)-cluster-protobuf demo分析
- 用Android打出马奔跑的动画,奔跑彩虹马百变版手机
- java语言程序设计第二版课后答案吴倩_Java语言程序设计
热门文章
- 如何理解 SAP UI5 的 sap.ui.define 函数
- 将 Observable.pipe 的输入参数手动分解
- SAP UI5 数据绑定之高级技巧 - Type System
- SAP Spartacus全局配置模块里和layoutSlot相关的配置
- SAP Spartacus取语言设置的入口程序
- Java Spring里getBean方法的实现
- Gradle中依赖任务产生的不同输出
- 使用OData服务创建SAP C4C的Lead数据,必须指定Account字段
- SAP CRM WebClient UI交互式报表的Gross Value工作原理
- ng-controller and ng-model的工作原理