【排序算法】四个排序算法理论基础+Python代码:冒泡、插入、选择、快速排序

排序算法

排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。
常见的内部排序算法有:插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等

排序算法的稳定性

稳定排序算法会让原本有相等键值的纪录维持相对次序。也就是如果一个排序算法是稳定的,当有两个相等键值的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。
例如序列:

51),(31),(32),(71

如果按照数组的第一个值进行排序,
稳定性算法排序后不会改变(3,1)和(3,2)的次序,结果为:

31),(32),(51),(71

非稳定性算法排序后可能会改变(3,1)和(3,2)的次序,结果为:

32),(31),(51),(71

一、冒泡排序(稳定性排序)

最坏时间复杂度:O(n^2)
最好时间复杂度:O(n)
平均时间复杂度:O(n^2)
空间复杂度:O(1)

1. 冒泡排序的思路(不额外增加空间,依次遍历,相邻元素两两交换)
首先从数组索引为0的位置开始遍历,比较该元素A和下一个元素B的大小,如果A更大,则交换AB的位置,直到遍历到末尾,整体遍历一次之后,保证了最后一位是最大的。但是除最后一位以外,前面的元素还是无序的状态,所以在下一次遍历时,按照上面的比较则再从头到尾 (这里的尾指的是无序数组的尾,即:不包括之前遍历过程中已经被放到数组尾部,排好序的其他元素) 进行比较与交换。直到把所有的元素遍历完成。
2. python实现

参考

def BubbleSort(array):arr_len = len(array)# 遍历的次数,外循环从第一位迭代至最后一位for i in range(arr_len-1):# 一次遍历内需要比较和交换的次数# 内循环将第一位迭代比较至arr_len-i位,因为i位置后的是已经排好序的不用重复比较for j in range(arr_len-i):if (j + 1 == arr_len):breakelif(array[j] > array[j+1]): temp=array[j]array[j]=array[j+1]array[j+1]=tempelse:continuereturn array

选择排序(非稳定性排序)

最坏时间复杂度:O(n^2)
最好时间复杂度:O(n^2)
平均时间复杂度:O(n^2)
空间复杂度:O(1)

1. 选择排序的思路(不额外增加空间,依次遍历,不一定是相邻元素两两交换)
无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。

具体来说,假设长度为n的数组arr,要按照从小到大排序,那么先从n个数字中找到最小值min1,如果最小值min1的位置不在数组的最左端(也就是min1不等于arr[0]),则将最小值min1和arr[0]交换,接着在剩下的n-1个数字中找到最小值min2,如果最小值min2不等于arr[1],则交换这两个数字,依次类推,直到数组arr有序排列

如果冒泡排序是从数组的末端开始依次变的有序,那么选择排序就是从数组的起始段开始变得有序

2. python实现

def SelectSort(array):for i in range(len(array)-1):  # 最后一个数字不用比较一定是最大的min = array[i]min_index = ifor j in range(i+1,len(array)):if(array[j] < min):min = array[j]min_index = j     # 记录比min小的数的下标else:continueif(min_index != i):  # 如果i位置不是最小的就不用交换temp=array[i]array[i]=array[min_index]array[min_index]=tempelse:continue  # 否则就不交换,从下一个i再次开始遍历return array

插入排序(稳定性排序)

最坏时间复杂度:O(n^2)
最好时间复杂度:O(n)
平均时间复杂度:O(n^2)
空间复杂度:O(1)

1. 插入排序思路(不额外增加空间,依次遍历,相邻元素两两交换)
插入排序可以理解为无序数组和有序数组两个部分,这里的插入就是指:将无序数组中的元素插入到有序数组的合适位置,假如一个数组[5,2,3,1],把5当成初始的有序数组,剩余元素[2,3,1]为无序数组,我们的目的就是遍历无序数组,再从后往前扫描有序数组,如果无序数组中的元素比有序数组中的元素小,就说明需要把这个元素插入到有序数组中。
2比5小,交换2和5的位置;
3比5小,交换3和5的位置,但是3比2大,所以不交换3和2的位置…依次类推

2. 代码实现

 def insertSort(self,array):for i in range(1,len(array)): # 无序数组index=i-1while index -1<=0: # 无序数组中第一个元素和有序数组中所有元素进行比较交换,直到无序数组的元素大于有序数组里面的,结束交换if array[index+1]<array[index]:temp=array[index]array[index]=array[index+1]array[index+1]=tempindex-=1else:breakreturn array

快速排序(非稳定算法)

最坏时间复杂度:O(n^2)
最好时间复杂度:O(nlogn)
平均时间复杂度:O(n
logn)
空间复杂度:O(n*logn)

1. 快速排序算法思路:
通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,已达到整个序列有序。一趟快速排序的具体过程可描述为:从待排序列中任意选取一个记录(通常选取第一个记录)作为基准值,然后将记录中关键字比它小的记录都安置在它的位置之前,将记录中关键字比它大的记录都安置在它的位置之后

2.python实现

参考

def QuickSort(array,left,right):# 选取数组的一个数为基准数i = leftj = rightif(left < right):pivot = array[left]while(left < right):# 在找得到比基准小的数之前直从后往前找,否则交换while(left < right and array[right] >= pivot): # 当前i的位置为基准值right = right -1if(left < right):swap(array,left,right)# 在找到比较基准大的数之前一直从前往后找, 否者交换while(left < right and array[left] <= pivot): # 当前j的位置为基准值left = left + 1if (left < right):swap(array, left, right)# 递归的进行左右两部分的快排QuickSort(array, i, right-1) # 左边QuickSort(array, right+1, j) # 右边return array

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

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

相关文章

【C++进阶】哈希的应用 --- 布隆过滤器

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

面试准备不充分,被Java守护线程干懵了,面试官主打一个东西没用但你得会

写在开头 面试官&#xff1a;小伙子请聊一聊Java中的精灵线程&#xff1f; 我&#xff1a;什么&#xff1f;精灵线程&#xff1f;啥时候精灵线程&#xff1f; 面试官&#xff1a;精灵线程没听过&#xff1f;那守护线程呢&#xff1f; 我&#xff1a;守护线程知道&#xff0c;就…

计算机软件文档编制规范GB_T 8567-2006

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 计算机软件文档编制规范概述 计算机软件文档编制规范&#xff08;Specification for computer software documentation&#xff09; 由TC28&#xff08;全国信息技术标准化技…

面试 Java 并发编程八股文十问十答第二期

面试 Java 并发编程八股文十问十答第二期 作者&#xff1a;程序员小白条&#xff0c;个人博客 相信看了本文后&#xff0c;对你的面试是有一定帮助的&#xff01;关注专栏后就能收到持续更新&#xff01; ⭐点赞⭐收藏⭐不迷路&#xff01;⭐ 1&#xff09;形成死锁的四个必要…

《HTTPS协议》

文章目录 一、什么是HTTPS协议二、理解关键字三、为什么要加密四、常见的加密方式1.对称加密2.非对称加密 五、如何进行加密&#xff1f;1.只使用对称加密2.只使用非对称加密3.双方都使用非对称加密4.使用对称加密非对称加密5.对称加密非对称加密CA证书认证5.1数据摘要&#xf…

GPT-4-turbo还是大家心中第一!Claude 3竞技场人类投票成绩出炉:仅居第三

Claude 3的竞技场排名终于揭晓了&#xff1a; 在仅仅3天的时间里&#xff0c;20000张投票使得排名的流量达到了前所未有的高度。 最后&#xff0c;Claude 3的"大杯"模型Opus以1233的分数赢得了胜利&#xff0c;成为了第一个能和GPT-4-Turbo匹敌的选手。 "中杯…

Flink 资源管理

文章目录 前言ResourceManager详解Slot 管理器SlotProviderSlot资源池Slot共享Slot共享的优点Slot 共享组与 Slot 共享管理器Slot资源申请 总结 前言 在Flink中&#xff0c;资源管理是一个核心组件&#xff0c;它负责分配和管理计算资源&#xff0c;以确保任务能够高效、稳定地…

Python使用Beautiful Soup及解析html获取元素并提取内容值

Python使用Beautiful Soup及解析html获取元素并提取内容值 1. 包括解析获取标题2. 根据标签及id获取所有元素3. 根据标签及class获取所有元素4. 获取元素下的标签的值5. 获取元素下的parent及child的元素的值参考 1. 包括解析获取标题 2. 根据标签及id获取所有元素 3. 根据标…

QGridLayout网格布局和QVBoxLayout垂直布局有着非常大的差别

QGridLayout网格布局&#xff1a;1.把这块控件划分成一个个的 单元格 2.把你的控件填充进入 单元格 3.这些有关限制大小的函数接口统统失效 setMaximumWidth&#xff08;&#xff09; setMinimumWidth() setPolicySize()图示&#xff1a;我是用的网格布局&#xff0c;左边放QT…

C# WinForm AndtUI第三方库 Table控件使用记录

环境搭建 1.在NuGet中搜索AndtUI并下载至C# .NetFramework WinForm项目。 2.添加Table控件至窗体。 使用方法集合 1.单元格点击事件 获取被点击记录特定列内容 private void dgv_CellClick(object sender, MouseEventArgs args, object record, int rowIndex, int columnIn…

观察者模式:Java 中的一对多依赖关系解决方案

观察者模式是一种行为设计模式&#xff0c;用于定义对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发生改变时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。这种模式通常用于解耦发布者和订阅者&#xff0c;使得系统更易于扩展和维护。 使用条件 观察…

【Python】装饰器函数

专栏文章索引&#xff1a;Python 原文章&#xff1a;装饰器函数基础_装饰函数-CSDN博客 目录 1. 学习装饰器的基础 2.最简单的装饰器 3.闭包函数装饰器 4.装饰器将传入的函数中的值大写 5. 装饰器的好处 6. 多个装饰器的执行顺序 7. 装饰器传递参数 8. 结语 1. 学习装饰…

C/C++蓝桥杯之整除序列

问题描述&#xff1a;有一个序列&#xff0c;序列的第一个数是n&#xff0c;后面的每个数均是前一个数整除2的结果&#xff0c;请输出这个序列中值为正数的所有项。 输入格式&#xff1a;输入一行&#xff0c;包含一个整数n。 输出格式&#xff1a;输出一行&#xff0c;包含多…

利用IDEA创建Java项目使用Servlet工具

【文件】-【项目结构】 【模块】-【依赖】-【】-【JAR】 找到Tomcat的安装路径打开【lib】找到【servlet.jar】点击【确定】 勾选上jar,然后【应用】-【确定】 此时新建文件可以发现多了一个Servlet&#xff0c;我们点击会自动创建一个继承好的Servlet类

计算机等级考试:信息安全技术 知识点三

1、拨号用户远程认证服务(Remote Authentication Dial-In User System&#xff0c;RADIUS)是一个网络协议&#xff0c;提供集中式AAA管理 2、在Windows NT里&#xff0c;口令字密文保存在SAM文件。 3、tracert是操作系统提供的命令。 4、Rootkit是一种内核隐藏技术&#xff…

STL容器之哈希的补充——其他哈希问题

1.其他哈希问题 ​ 减少了空间的消耗&#xff1b; 1.1位图 ​ 位图判断在不在的时间复杂度是O(1)&#xff0c;速度特别快; ​ 使用哈希函数直接定址法&#xff0c;1对1映射&#xff1b; ​ 对于海量的数据判断在不在的问题&#xff0c;使用之前的一些结构已经无法满足&…

基于PSO粒子群算法的三角形采集堆轨道优化matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 假设一个收集轨道&#xff0c;上面有5个采集堆&#xff0c;这5个采集堆分别被看作一个4*20的矩阵&#xff08;下面只有4*10&#xff09;&#xff0c;每个模块&…

【python3】多进程Pipe实现数据流模型

当涉及到数据流模型时&#xff0c;常见的方法是使用管道&#xff08;Pipe&#xff09;来实现进程间的通信。在数据流模型中&#xff0c;计算过程表示为数据流图&#xff0c;数据从一个节点流向另一个节点&#xff0c;并在节点之间进行转换和处理。 以下是一个稍微复杂一些的数…

opencv编程

opencv编程 引言&#xff1a; ​ 本实验旨在介绍使用OpenCV进行图像处理和视频处理的基本操作。OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源计算机视觉库&#xff0c;提供了丰富的图像和视频处理功能&#xff0c;既可以进行图像的读取、显示…

187基于matlab的弹道目标跟踪滤波方法

基于matlab的弹道目标跟踪滤波方法&#xff0c;扩展卡尔曼滤波&#xff08;extended Kalman filter, EKF&#xff09;、转换测量卡尔曼滤波&#xff08;conversion measurement Kalman filter, CMKF&#xff09;跟踪滤波&#xff0c;得到距离、方位角、俯仰角误差结果。程序已调…