当前位置: 首页 > news >正文

常见的几种排序算法

在这里插入图片描述

1、冒泡排序

冒泡排序是一种简单的排序算法。
工作原理:重复地遍历要排序的列表,比较每对相邻项,如果它们的顺序错误就把它们交换过来。
用从小到大的排序举例,先比较第1和第2,再比较第2和第3,再比较第3和第4,依次对比,每一对比过程中如果大的数在前,则两个值位置互换。

时间复杂度最好为O(n),最坏为O(n2),其中n是要排序的元素个数
空间复杂度为O(1),因为它只需要固定的额外空间来进行元素交换,与待排序数据量无关。
在这里插入图片描述

def bubbleSort(arr):for i in range(len(arr) - 1):  # 来回推len(arr)-1次 i就是已经排序完成了多少到最后for j in range(len(arr) - i - 1):  # 每一遍都会把未排序部分中最大的推到后面 橙色已排序的部分不需要再排了 故-iif arr[j] > arr[j + 1]:arr[j], arr[j + 1] = arr[j + 1], arr[j]  # 大的往后排 置换数值return arr
if __name__ == '__main__':arr_li = [1, 3, 9, 4, 0, 2, 7, 5, 8, 6]print(bubbleSort(arr_li))

2、选择排序

选择排序是一种简单且直观的排序算法。
工作原理是:首先在未排序序列中找到最小(或最大)元素,然后将其放到已排序序列的首部或末尾。重复这个过程,直到整个序列有序。这种算法的时间复杂度为O(n2),不需要额外的空间,是一种不稳定的排序算法。
它和冒泡类似,每一次大遍历都是把最大或最小的放置在首部或尾部(橙色部分),需要length-1次大遍历,每次大遍历中有length-1-i次小遍历(i是已排元素个数,也是已经大遍历的次数)

选择排序的时间复杂度为O(n2),空间复杂度为O(1)。
在这里插入图片描述

def selectionSort(arr):for i in range(len(arr) - 1):minInd = i  # 放置最小值的下标for j in range(i + 1, len(arr)):  # 跳过已经排序好的前i个 每次都到len(arr)最后一个元素print(j)if arr[j] < arr[minInd]:minInd = j# 每一次大遍历后 对比剩余部分最小值和遍历起始下标值if minInd != i:arr[i], arr[minInd] = arr[minInd], arr[i]return arr
if __name__ == '__main__':arr_li = [1, 3, 9, 4, 0, 2, 7, 5, 8, 6]print(selectionSort(arr_li))

3、插入排序

插入排序是一种简单且直观的排序算法。
工作原理:依次从未排序元素的首位(或尾部)取出一个元素,将与已排序部分逐个对比,直到满足条件,将取出的元素放置在最后一次对比元素前,重复以上步骤直到未排序元素都被插入并排好序为止。

同冒泡排序时空复杂度,时间复杂度为最好为O(n),最坏为O(n2),,空间复杂度为O(1)。
在这里插入图片描述

def insertionSort(arr):for i in range(len(arr)):  # 大遍历次数len(arr)current = arr[i]  # 每次拿出一个current数组  依次和前面的作比较preInd = i - 1  # current要和这个下标的值对比 第一次是和下标-1的对比 即直接将current放在preInd前(作为排序好的首位)while preInd >= 0 and arr[preInd] > current:arr[preInd + 1] = arr[preInd]preInd -= 1  # 继续往前对比arr[preInd + 1] = current  # 直到前面没有比current大的了 将current放进刚对比的arr[preInd]前return arr
if __name__ == '__main__':arr_li = [1, 3, 9, 4, 0, 2, 7, 5, 8, 6]print(insertionSort(arr_li))

4、希尔排序

希尔排序是一种基于插入排序的排序算法,也被称为“缩小增量排序”。
工作原理:通过将待排序的数组分成若干个子序列,然后对这些子序列分别进行插入排序。这些子序列是原始数组中相隔固定增量(gap)的元素组成的。随着排序进行,增量逐渐减小,最终变为1,此时数组基本有序,最后一次插入排序即可完成排序。希尔排序的关键在于增量序列的选择,不同的增量序列会影响算法的性能。

时间复杂度取决于增量序列的选择,在O(n log2 n)与O(n2)之间。
空间复杂度为O(1),因为希尔排序在排序过程中只需要常数级别的额外空间来存储临时变量。
在这里插入图片描述

def shellSort(arr):gap = len(arr) // 2while gap > 0:  # 每一次跳gap次取元素作为一组for i in range(gap, len(arr)):  # 对同一组内的元素进行插入排序 从后往前遍历已排序的元素并插入 56789tempInd = iwhile tempInd >= gap and arr[tempInd] < arr[tempInd - gap]:arr[tempInd], arr

相关文章:

  • 预训练CNN网络的迁移学习(MATLAB例)
  • webgl工程发布问题解决记录
  • 【在线五子棋对战】五、前端扫盲:html css javascript ajax jquery websocket
  • LeetCode 3423.循环数组中相邻元素的最大差值:遍历(模拟)
  • 基于GeoTools的道路相交多个点容差冗余计算实战
  • Unity性能优化-C#编码模块
  • 项目名称:基于计算机视觉的夜间目标检测系统
  • 本地内网搭建网址需要外部网络连接怎么办?无公网ip实现https/http站点外网访问
  • 公网 IP 地址SSL证书实现 HTTPS 访问完全指南
  • Ubuntu下使用PyTurboJPEG加速图像编解码
  • 新能源知识库(46)EMS与协控装置
  • Peiiieee的Linux笔记(1)
  • [OS_20] 设备和驱动程序 | GPIO | IPP | PCIe总线 | ioctl
  • Android S - 恢复部分应用安装
  • 使用Gitlab CI/CD结合docker容器实现自动化部署
  • javascript入门
  • RT-Thread Studio 配置使用详细教程
  • Spring Cloud Gateway 介绍
  • 金蝶K3 ERP 跨网段访问服务器卡顿问题排查和解决方法
  • 用户态与内核态是什么?有什么作用?两者在什么时候切换?为什么要切换?
  • 360网站提交/搜索引擎优化网站的网址
  • 源美网站建设/大学生网页制作成品模板
  • 郑州网站建设一汉狮网络/免费b站推广网站不
  • 旅游网站建设/网络销售怎么做
  • 15 企业网站优化方案有哪些内容/seo职位具体做什么
  • 建站公司网站建设/英文网站seo