排序算法小结

排序算法小结

排序是工作和生活中非常常见的一个问题。现在已经有比较成熟的排序技术,被广泛地应用于各种程序语言或数据库中。不同的排序算法有不同的性能和适用场景,下面的视频对比了 9 种排序算法的性能表现。排序算法依次为选择排序、希尔排序、插入排序、归并排序、快速排序、堆排序、冒泡排序、梳排序、鸡尾酒排序。

九种排序算法的可视化及比较

 

冒泡排序

冒泡排序(Bubble Sort)是一种交换排序,基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

在最好的情况下,也就是数列本身是排好序的,需要进行 n – 1 次比较;在最坏的情况下,也就是数列本身是逆序的,需要进行 n(n-1)/2 次比较。因此冒泡排序总的时间复杂度是 O(n^2)。

 

选择排序

选择排序(Selection sort) 的基本思想是每一趟在 n – i + 1 (i = 1,2,***,n – 1)个记录中选取关键字最小(或最大)的记录作为有序序列的第 i 个记录,直到所有元素排序完成。选择排序是不稳定的排序算法。

选择排序的时间复杂度为 O(n^2),但性能上略优于冒泡排序。

 

插入排序

插入排序类似于整理扑克牌,基本操作是将一个记录插入到已经排好序的有序数列中,从而得到一个有序但记录数加一的有序数列。

插入排序的时间复杂度为 O(n^2),是稳定的排序方法,适用于数量较少的排序。

 

鸡尾酒排序

鸡尾酒排序是冒泡排序的一种变形。先找到最小的数字,放在第一位,再找到最大的数字放在最后一位。然后再找到第二小的数字放到第二位,再找到第二大的数字放到倒数第二位。以此类推,直到完成排序。

鸡尾酒排序的时间复杂度为 O(n^2)。

 

希尔排序

希尔排序(Shell Sort)是插入排序的一种,是针对直接插入排序算法的改进。基本思想是将相距某个增量 d 的记录组成一个子序列,通过插入排序使得这个子序列基本有序,然后减少增量继续排序。

 

操作上先取一个小于 n 的整数 d1 作为第一个增量,把全部记录分成 d1 个组,所有距离为 dl 的倍数的记录放在同一个组中。先在各组内进行直接插人排序,然后取第二个增量d2 < d1 重复上述的分组和排序,直至所取的增量 dt = 1 (dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

 

希尔排序的时间复杂度可以达到 O(n^(3/2)),要好于前面几种算法。

 

梳排序

梳排序和希尔排序很类似。希尔排序是在直接插入排序的基础上做的优化,而梳排序是在冒泡排序的基础上做的优化,也就是将相距某个增量 d 的记录组成一个子序列,通过冒泡排序使得这个子序列基本有序,然后减少增量继续排序。

梳排序的时间复杂度是 O(nlogn)。

 

归并排序

归并排序(MERGE-SORT) 是一种分治算法,是建立在归并操作上的一种有效的排序算法。常用的 2 路归并排序假设初始序列有 n 个记录,可以看成是 n 个长度为 1 的子序列,进行两两归并,可以得到 n / 2 个长度为 2 或 1 的子序列;再两两归并,******,直到得到一个长度为 n 的有序序列为止。

归并排序的时间复杂度是 O(nlogn),是一种效率高且稳定的算法。

 

快速排序

快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分的记录都比另一部分小,然后再分别对这两个部分进行快速排序,最终实现整个序列的排序。

快速排序的时间复杂度为 O(nlogn),是一种不稳定的排序算法;

 

堆排序

堆是具有下列性质的完全二叉树:

1. 每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆;

2. 每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆。

 

堆排序(Heap sort)是指利用堆这种数据结构所设计的一种排序算法。基本思想是把待排序的序列构造成一个大顶堆,此时序列的最大值就是队顶元素,把该元素放在最后,然后对剩下的 n – 1 个元素继续构造大顶堆,直到排序完成。

 

堆排序的时间复杂度为 O(nlogn),由于要构造堆,因此不适用于序列个数较少的情况。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/119659.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PROXY SERVER 代理服务器[通俗易懂]

    Proxy是什么呢,是代理。普通的因特网访问是一个典型的客户机与服务器结构:用户利用计算机上的客户端程序,如浏览器发出请求,远端WWW服务器程序响应请求并提供相应的数据。而Proxy处于客户机与服务器之间,对于服务器来说,Proxy是客户机,Proxy提出请求,服务器响应;对于客户机来说,Proxy是服务器,它接受客户机的请求,并将服务器上传来的数据转给客户机。它的作用很象现实生活中的代理服务商…

    2022年4月18日
    43
  • luajit性能优化[通俗易懂]

    luajit性能优化[通俗易懂]本文转载地址:(http://www.cnblogs.com/zwywilliam/p/5992737.html)luajit是目前最快的脚本语言之一,不过深入使用就很快会发现,要把这个语言用到像宣称那样高性能,并不是那么容易。实际使用的时候往往会发现,刚开始写的一些小testcase性能非常好,经常毫秒级就算完,可是代码复杂度一上去了,动辄几十上百毫秒的情况就会出现,性能表现非常飘忽。

    2022年10月6日
    3
  • beanCopier_cerdip封装

    beanCopier_cerdip封装BeanCopier封装

    2025年9月15日
    7
  • pycharm最新激活码(注册激活)「建议收藏」

    (pycharm最新激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~S…

    2022年3月26日
    135
  • 在Linux系统中安装pycharm详解

    在Linux系统中安装pycharm详解1 在官网下载 pycharm 安装包 1 1 进入官网 DownloadPyCh PythonIDEfor 选择 Professional 专业版 直接下载 自己可以选择 pycharm 的不同版本 1 2 进入跳转页面后 出现提示框 点 savefile 1 3 下载完成后 打开安装包下载的位置 2 安装 pycharm2 1 解压文件 2 打开终端 进入 pych

    2025年6月20日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号