首页 > 编程语言 >说说常见的排序算法有哪些?区别?

说说常见的排序算法有哪些?区别?

时间:2024-04-20 18:34:02浏览次数:27  
标签:哪些 复杂度 元素 算法 有序 序列 排序

一、是什么

排序是程序开发中非常常见的操作,对一组任意的数据元素经过排序操作后,就可以把他们变成一组一定规则排序的有序序列

排序算法属于算法中的一种,而且是覆盖范围极小的一种,彻底掌握排序算法对程序开发是有很大的帮助的

对与排序算法的好坏衡量,主要是从时间复杂度、空间复杂度、稳定性

时间复杂度、空间复杂度前面已经讲过,这里主要看看稳定性的定义

稳定性指的是假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变

即在原序列中,r[i] = r[j],且 r[i] 在 r[j] 之前,而在排序后的序列中,r[i] 仍在 r[j] 之前,则称这种排序算法是稳定的;否则称为不稳定的

二、有哪些

常见的算法排序算法有:

  • 冒泡排序
  • 选择排序
  • 插入排序
  • 归并排序
  • 快速排序

冒泡排序

一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来

思路如下:

  • 比较相邻的元素,如果第一个比第二个大,就交换它们两个

  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数

  • 针对所有的元素重复以上的步骤,除了最后一个

  • 重复上述步骤,直到没有任何一堆数字需要比较

选择排序

选择排序是一种简单直观的排序算法,它也是一种交换排序算法

无论什么数据进去都是 O(n²)的时间复杂度。所以用到它的时候,数据规模越小越好

唯一的好处是不占用额外的内存存储空间

思路如下:

  • 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
  • 从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  • 重复第二步,直到所有元素均排序完毕

插入排序

插入排序是一种简单直观的排序算法

它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入

解决思路如下:

  • 把待排序的数组分成已排序和未排序两部分,初始的时候把第一个元素认为是已排好序的
  • 从第二个元素开始,在已排好序的子数组中寻找到该元素合适的位置并插入该位置(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
  • 重复上述过程直到最后一个元素被插入有序子数组中

归并排序

归并排序是建立在归并操作上的一种有效的排序算法

该算法是采用分治法的一个非常典型的应用

将已有序的子序列合并,得到完全有序的序列,即先使每个子序列有序,再使子序列段间有序

解决思路如下:

  • 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  • 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  • 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  • 重复步骤3直到某一指针到达序列尾
  • 将另一序列剩下的所有元素直接复制到合并序列尾

快速排序

快速排序是对冒泡排序算法的一种改进,基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小

再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,使整个数据变成有序序列

解决思路如下:

  • 从数列中挑出一个元素,称为"基准"(pivot)
  • 重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(相同的数可以到任何一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作
  • 递归地(recursively)把小于基准值元素的子数列和大于基准值元素的子数列排序

 

三、区别

除了上述的排序算法之外,还存在其他的排序算法,例如希尔排序、堆排序等等......

区别如下图所示:

参考文献

  • https://www.runoob.com/w3cnote/bubble-sort.html
  • http://www.x-lab.info/post/sort-algorithm/
  • https://zhuanlan.zhihu.com/p/42586566

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

 

标签:哪些,复杂度,元素,算法,有序,序列,排序
From: https://www.cnblogs.com/smileZAZ/p/18147983

相关文章

  • 《算法竞赛进阶指南》 第六章 291. 蒙德里安的梦想 状态压缩DP
    https://www.acwing.com/problem/content/293/求把N×M的棋盘分割成若干个1×2的长方形,有多少种方案。例如当N=2,M=4时,共有5种方案。当N=2,M=3时,共有3种方案。如下图所示:输入格式输入包含多组测试用例。每组测试用例占一行,包含两个整数N和M。当输入用例N=0......
  • js,php,C++ 压缩算法不一致
    参考:https://yushuangqi.com/blog/2015/golang-php-gzencode-difrent.html压缩的数据:这是要压缩的数据aaaaaaaaaaaaaaaaaaa2222222222222222222222222222222顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶顶fffffffffffffffffffgggggggggggggggggggeeeeeeeeeeeeee对应的三种语言的最后数......
  • 【Java 线程】SpringBoot 启动后都有哪些线程呢?
    1 前言现在流行搞微服务,基本也都是SpringBoot打底的,那么你可否知道一个基本的SpringBoot启动后,都开辟了哪些线程呢?这节我们就来看看。为什么要看呢?这个主要是增加对服务的了解,比如你管的支付中心或者订单中心,你都有哪些线程,各个线程都是干什么的,你不了解这些你怎么调优,你......
  • 国内chatGPT中文版网站有哪些?国内人工智能百花齐放!该如何选择?
    人工智能技术在中国的快速发展和普及,使得国内的人工智能产业日益壮大。在这些领域中,自然语言处理技术和聊天机器人已经取得了显著的进展。ChatGPT作为一种基于深度学习的聊天机器人模型,在国内得到了广泛的关注和应用。目前,有几个国产ChatGPT中文版网站备受瞩目。国产chatGPT汇总:......
  • 算法中的变形金刚——单纯形算法学习笔记
    目录阅读本文你将会知道线性规划简介线性规划的标准形一般型转标准型<与≤线性规划的松弛形标准型转松弛形单纯形算法基本可行解如何判断最优旋转操作如何通过旋转更新解?退化与布兰德规则基本不可行解单纯形算法的几何意义单纯形算法的时间复杂度分析线性规划问题有更优的做法吗......
  • 过氧化氢滴定方法可用的PFA器皿有哪些?
    滴定液:KMnO4标准溶液试液:H2O2商品液(3%),H2SO4(3.0mol/L)指示剂:酚酞指示剂仪器:分析天平,PFA酸式滴定管50mL,PFA移液管10mL/25mL、PFA容量瓶250mL、PFA锥形瓶250mL1、KMnO4标准溶液浓度的标定(见实验:高锰酸钾标准溶液的配制与标定)2、H2O2含量的测定用PFA移液管10mL移......
  • knn算法的实现
      目录1.概念2.代码实战3.关于如何解决预测不准  3.1)调整k的值会影响预测值  3.2)增加数据的维度4.空间和维度  4.1)一维空间  4.2)二维空间  4.3)三维空间  4.4)空间中两点距离的计算5.精度问题之数据归一化处理  1.概念   KNN(K-N......
  • 数据结构与算法学习(1)——DFS(深度优先搜索)
    DFS基础深度优先搜索算法(英语:Depth-First-Search,缩写为DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深地搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发......
  • 基环树算法总结
    基环树算法总结一、什么是基环树基环树,顾名思义,有两个要素:环和树。因此,基环树就是一棵树的一个节点,扩成一个环,做题时,多棵基环树组成的基环树森林,常以如下方式出现:每个点只有一个出边。每个点只有一个入边。图中一共有\(n\)个点,\(n\)条边。那么,基环树类型的题目应该怎......
  • 希尔排序
    #include<iostream>#include<cmath>usingnamespacestd;intmain(){intn;cin>>n;inta[n+5];for(inti=0;i<n;i++){cin>>a[i];}for(doublei=n;i>1;){i=round(i/2);for(i......