排序算法 - 6种 - 超炫的动画演示 - Python实现

1.冒泡排序

思路:遍历列表,每一轮每次比较相邻两项,将无序的两项交换,下一轮遍历比前一轮比较次数减1。

  1. def bubble_sort(a_list):
  2. for passnum in range(len(a_list)-1, 0, -1):
  3. for i in range(passnum):
  4. if a_list[i] > a_list[i+1]:
  5. a_list[i], a_list[i+1] = a_list[i+1], a_list[i]

改进:遍历期间没有交换,则认为已排序,可以停止。

  1. def short_bubble_sort(a_list):
  2. exchanges = True
  3. passnum = len(a_list) - 1
  4. while passnum > 0 and exchanges:
  5. exchanges = False
  6. for i in range(passnum):
  7. if a_list[i] > a_list[i+1]:
  8. exchanges = True
  9. a_list[i], a_list[i+1] = a_list[i+1], a_list[i]
  10. passnum = passnum - 1

动画演示:

2.选择排序

思路:遍历列表,每次遍历选出最大的放在合适的位置。

  1. def selection_sort(a_list):
  2. for fillslot in range(len(a_list)-1, 0, -1):
  3. position_max=0
  4. for location in range(1, fillslot+1):
  5. if a_list[location] > a_list[position_max]:
  6. position_max = location
  7. a_list[fillslot], a_list[position_max] = a_list[position_max], a_list[fillslot]

动画演示:

3.插入排序

思路:每一步都将待插入的数据按大小插入到已排序的数据中的合适位置。

  1. def insertion_sort(a_list):
  2. for index in range(1, len(a_list)):
  3. cur_value = a_list[index]
  4. pos = index
  5. while pos > 0 and a_list[pos-1] > cur_value:
  6. a_list[pos] = a_list[pos-1]
  7. pos = pos - 1
  8. a_list[pos] = cur_value

动画演示:

4.希尔排序

思路:分解为多个子列表进行插入排序,不是连续分,而是通过增量。

  1. def shell_sort(a_list):
  2. sublist_count = len(a_list)
  3. while sublist_count > 0:
  4. for start_position in range(sublist_count):
  5. gap_insertion_sort(a_list, start_position, sublist_count)
  6. sublistcount = sublistcount // 2
  7. def gap_insertion_sort(a_list, start, gap):
  8. for i in range(start+gap, len(a_list), gap):
  9. current_value = a_list[i]
  10. position = i
  11. while position >= gap and a_list[position-gap] > current_value:
  12. a_list[position] = a_list[position-gap]
  13. position = position - gap
  14. a_list[position] = current_value

5.归并排序

思路:分而治之,不断拆分为一半,直至项数为0或1,然后排序合并。需要额外空间。

  1. def merge_sort(a_list):
  2. if len(a_list) > 1:
  3. mid = len(a_list) // 2
  4. lefthalf = a_list[:mid]
  5. righthalf = a_list[mid:]
  6. merge_sort(lefthalf)
  7. merge_sort(righthalf)
  8. i=0
  9. j=0
  10. k=0
  11. while i < len(lefthalf) and j < len(righthalf):
  12. if lefthalf[i] < righthalf[j]:
  13. a_list[k] = lefthalf[i]
  14. i = i + 1
  15. else:
  16. a_list[k] = righthalf[j]
  17. j = j + 1
  18. k=k+1
  19. while i < len(lefthalf):
  20. a_list[k] = lefthalf[i]
  21. i = i + 1
  22. k = k + 1
  23. while j < len(righthalf):
  24. a_list[k] = righthalf[j]
  25. j = j + 1
  26. k = k + 1

动画演示:

6.快速排序

思路:与归并一样使用分而治之,不使用额外内存,特点是枢轴值。

  1. def quick_sort(a_list):
  2. quick_sort_helper(a_list, 0, len(a_list)-1)
  3. def quick_sort_helper(a_list, first, last):
  4. if first < last:
  5. splitpoint = partition(a_list, first, last)
  6. quick_sort_helper(a_list, first, splitpoint-1)
  7. quick_sort_helper(a_list, splitpoint+1, last)
  8. def partition(a_list, first, last):
  9. pivotvalue = a_list[first]
  10. leftmark = first + 1
  11. rightmark = last
  12. done = False
  13. while not done:
  14. while leftmark <= rightmark and a_list[leftmark] <= pivotvalue:
  15. leftmark = leftmark + 1
  16. while a_list[rightmark] >= pivotvalue and rightmark >= leftmark:
  17. rightmark = rightmark -1
  18. if rightmark < leftmark:
  19. done = True
  20. else:
  21. a_list[leftmark], a_list[rightmark] = a_list[rightmark], a_list[leftmark]
  22. a_list[first], a_list[rightmark] = a_list[rightmark], a_list[first]

动画演示:

说明:

1.参考https://interactivepython.org/runestone/static/pythonds/SortSearch/toctree.html

2.动画来自https://visualgo.net/en 截图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/475513.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

因子分析模型 - Python 做因子分析简直比 SPSS 还简单 - ( Python、SPSS)

为什么&#xff1f; SPSS 那么简单还免费&#xff0c;为什么还要用 Python 做因子分析&#xff08;factor analysis&#xff09;呢&#xff1f;工作狗表示&#xff0c;建模的目的是要卖钱的&#xff0c;也就是要嵌入到公司开发的产品上去&#xff0c;用 Python 写因子分析&…

缺失值处理 - 拉格朗日插值法 - Python代码

目录 缺失值处理 拉格朗日差值法的理论基础 拉格朗日插值法代码实现 其他数据预处理方法 缺失值处理 处理缺失值常用的办法可分为三类&#xff1a;删除记录、数据插补、不处理。 其中常见的数据插补法有&#xff1a; 如果通过删除小部分的数据就可以达到既定的目标&#…

做po_requisitions_interface_all接口开发问题

po_requisitions_interface_all这个接口表的字段charge_account_id来源于: 1、组织参数的Material Account 2、工单类型的Outside Processing Account 转载于:https://www.cnblogs.com/songdavid/archive/2011/09/19/2181757.html

[Hands On ML] 3. 分类(MNIST手写数字预测)

文章目录1. 数据预览2. 数据集拆分3. 二分类4. 性能评估4.1 交叉验证4.2 准确率、召回率4.3 受试者工作特征&#xff08;ROC&#xff09;曲线5. 多分类6. 误差分析6.1 检查混淆矩阵本文为《机器学习实战&#xff1a;基于Scikit-Learn和TensorFlow》的读书笔记。 中文翻译参考 …

支持向量机 - 从原理到算法的实现

思想&#xff1a;寻找能够成功分开两类样本并且具有最大分类间隔的最优超平面。 1.原理解析 空间中任何一个平面的方程都可以表示为wxb 0,如上图&#xff0c;设最优超平面方程H为wxb0,支持向量x-到H的距离为,要使分类间隔最大&#xff0c;即该距离最大&#xff0c;而该距离只与…

Struts2初始化过程代码分析

根据web.xml的配置 调用FilterDispatcher.init(FilterConfig filterConfig) 1. 创建org.apache.struts2.Dispatcher&#xff0c;并调用init()方法 1.1. 创建com.opensymphony.xwork2.config.ConfigurationManager,其中属性List<ContainerProvider> containerProviders存放…

LeetCode 1292. 元素和小于等于阈值的正方形的最大边长(DP)

1. 题目 给你一个大小为 m x n 的矩阵 mat 和一个整数阈值 threshold。 请你返回元素总和小于或等于阈值的正方形区域的最大边长&#xff1b; 如果没有这样的正方形区域&#xff0c;则返回 0 。 示例 1&#xff1a; 输入&#xff1a;mat [[1,1,3,2,4,3,2],[1,1,3,2,4,3,2],[…

从这十大算法开始学习机器学习与建模

本文介绍了机器学习新手需要了解的 10 大算法&#xff0c;包括线性回归、Logistic 回归、朴素贝叶斯、K 近邻算法等。 在机器学习中&#xff0c;有一种叫做「没有免费的午餐」的定理。简而言之&#xff0c;它指出没有任何一种算法对所有问题都有效&#xff0c;在监督学习&…

.NET 动态脚本语言Script.NET系列文章汇总 非常精彩的应用举例

对于Script.NET,我已经写了三篇文章来介绍它&#xff0c;文章汇总如下 .NET 动态脚本语言Script.NET 入门指南 Quick Start .NET 动态脚本语言Script.NET 开发指南 .NET 动态脚本语言Script.NET 应用举例 希望这三篇文章能帮助你了解Script.NET。 下面的例子&#xff0c;继续讲…

异常值处理 - iterrows()对 DataFrame 进行遍历,并修改遍历中的异常值 - Python代码

先要有一个很简单的被命名为 data 的表&#xff1a; 第三列是一个名曰周杰伦的人历年来每个月的月薪&#xff0c;其中2016年月薪10万&#xff0c;纵观他历年来的月薪基本不超过3万&#xff08;显然他不是我的偶像胖伦&#xff09;&#xff0c;因此对于这个人来说月薪10万是有些…

LeetCode 44. 通配符匹配(DP)

1. 题目 给定一个字符串 (s) 和一个字符模式 (p) &#xff0c;实现一个支持 ? 和 * 的通配符匹配。 ? 可以匹配任何单个字符。* 可以匹配任意字符串&#xff08;包括空字符串&#xff09;。 两个字符串完全匹配才算匹配成功。 说明: s 可能为空&#xff0c;且只包含从 a-…

HtmlAgilityPack/xpath

【转载】HTML解析利器HtmlAgilityPack在网上发现了一个.NET下的HTML解析类库HtmlAgilityPack。HtmlAgilityPack是一个支持用XPath来解析HTML的类库&#xff0c;在花了一点时间学习了解HtmlAgilityPack的API和XPath之后&#xff0c;周公就做了一个简单的工具完成了这个功能&…

MVVM更容易内存泄露吗?

由于MVVM是把View, ViewModel, Model紧紧绑定在一起的模式&#xff0c;特别视图和视图模型通过实现观察者模式双向绑定和NotifyPropertyChanged事件&#xff0c;似乎更加容易造成内存泄露/内存不释放。网上也有这种说法。真的是这样的吗&#xff1f;我们来实际测试一下。 实际测…

分组统计 - 不同时间颗粒度下,按照秒、分、时、日、周、月、季度、年 GROUP BY 分组统计 - (MySQL)

数据处理时&#xff0c;经常需要&#xff1a;统计不同时间粒度下的数据分布情况。 例如&#xff0c;网站每天&#xff08;or每小时&#xff09;的访问量&#xff0c;周杰伦每年&#xff08;or每季度 or每月&#xff09;的收入等。 首先有一个表叫&#xff1a;table_test&…

LeetCode 971. 翻转二叉树以匹配先序遍历(DFS)

1. 题目 给定一个有 N 个节点的二叉树&#xff0c;每个节点都有一个不同于其他节点且处于 {1, …, N} 中的值。 通过交换节点的左子节点和右子节点&#xff0c;可以翻转该二叉树中的节点。 考虑从根节点开始的先序遍历报告的 N 值序列。将这一 N 值序列称为树的行程。 &…

缺失值处理 - 获取一段时间内所有日期的列表 - (Python、MySQL)

有的时候做数据清洗的时候 &#xff0c; 如果表中数据在某一天没有记录&#xff0c;但是业务要求不能有缺失日期&#xff0c;那么就需要我们将这些缺失日期补上。这个前提就是我们先要有一张包含所有日期的列表&#xff08;作为左表&#xff09;&#xff0c;供我们进行匹配&…

[Kaggle] Digit Recognizer 手写数字识别

文章目录1. Baseline KNN2. Try SVCDigit Recognizer 练习地址 相关博文&#xff1a;[Hands On ML] 3. 分类&#xff08;MNIST手写数字预测&#xff09; 1. Baseline KNN 读取数据 import pandas as pd train pd.read_csv(train.csv) X_test pd.read_csv(test.csv)特征、…

Power BI 数据分析可视化软件入门教程

入 门 l Power BI 的引导学习 什么是Power BI&#xff1f; Power BI 是软件服务、应用和连接器的集合&#xff0c;它们协同工作以将相关数据来源转换为连贯的视觉逼真的交互式见解。 Power BI 简单且快速&#xff0c;能够从 Excel 电子表格或本地数据库创建快速见解。同…

分组统计 - DataFrame.groupby() 所见的各种用法 - Python代码

目录 所见 1 &#xff1a;日常用法 所见 2 &#xff1a;解决groupby.sum() 后层级索引levels上移的问题 所见 3 &#xff1a;解决groupby.apply() 后层级索引levels上移的问题 所见 4 &#xff1a;groupby函数的分组结果保存成DataFrame groupby的函数定义&#xff1a; Da…

线性回归 - 多元线性回归案例 - 分析步骤、输出结果详解、与Python的结果对比 -(SPSS建模)

现在用 Python 写线性回归的博客都快烂大街了&#xff0c;为什么还要用 SPSS 做线性回归呢&#xff1f;这就来说说 SPSS 存在的原因吧。 SPSS 是一个很强大的软件&#xff0c;不用编程&#xff0c;不用调参&#xff0c;点巴两下就出结果了&#xff0c;而且出来的大多是你想要的…