排序算法&分析——什么时候 用 什么排序

这篇具有很好参考价值的文章主要介绍了排序算法&分析——什么时候 用 什么排序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

了解各种排序,详见排序专栏

排序算法历史

纵观排序算法的历史,有哪些排序算法的速度可以到达 O ( n   l o g ( n ) ) O(n~log(n)) O(n log(n))

  • 冒泡排序 B u b b l e Bubble Bubble S o r t Sort Sort):冒泡排序是最简单的排序算法之一。它通过多次比较和交换相邻元素的方式,将最大(或最小)的元素逐渐“冒泡”到数组的一端。尽管冒泡排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2),效率较低,但它易于理解和实现。

  • 选择排序 S e l e c t i o n Selection Selection S o r t Sort Sort):选择排序是一种简单直观的排序算法。它通过每次选择未排序部分的最小(或最大)元素,并将其放置在已排序部分的末尾,逐渐构建有序序列。选择排序的时间复杂度也为 O ( n 2 ) O(n^2) O(n2),但相比冒泡排序,它的交换次数较少。

  • 插入排序 I n s e r t i o n Insertion Insertion S o r t Sort Sort):插入排序是一种稳定的排序算法。它通过将未排序部分的元素逐个插入已排序部分的适当位置,来构建有序序列。插入排序的时间复杂度为 O ( n 2 ) O(n^2) O(n2),但对于小规模或基本有序的数组,插入排序的性能较好。

  • 希尔排序 S h e l l Shell Shell S o r t Sort Sort):希尔排序是插入排序的一种改进版本。它通过将数组分割成多个较小的子序列,并对子序列进行插入排序,最后再对整个数组进行一次插入排序。希尔排序的时间复杂度介于 O ( n ) O(n) O(n) O ( n 2 ) O(n^2) O(n2)之间,取决于所选的间隔序列。

  • 归并排序 M e r g e Merge Merge S o r t Sort Sort):归并排序是一种分治算法。它将数组递归地分成两个子数组,分别进行排序,然后将两个有序子数组合并成一个有序数组。归并排序的时间复杂度为 O ( n   l o g ( n ) ) O(n~log(n)) O(n log(n)),它是一种稳定的排序算法。

  • 快速排序 Q u i c k Quick Quick S o r t Sort Sort):快速排序也是一种分治算法。它通过选择一个基准元素,将数组分成两个子数组,其中一个子数组的所有元素都小于基准元素,另一个子数组的所有元素都大于基准元素。然后递归地对两个子数组进行排序。快速排序的时间复杂度为 O ( n   l o g ( n ) ) O(n~log(n)) O(n log(n)),但在最坏情况下可能达到 O ( n 2 ) O(n^2) O(n2)

  • 堆排序 H e a p Heap Heap S o r t Sort Sort):堆排序利用堆这种数据结构进行排序。它通过构建最大堆(或最小堆),将堆顶元素与最后一个元素交换,并对剩余元素重新调整堆,重复这个过程直到整个数组有序。堆排序的时间复杂度为 O ( n   l o g ( n ) ) O(n~log(n)) O(n log(n)),它是一种不稳定的排序算法。

  • 计数排序(这个不能算排序吧~)( C o u n t i n g Counting Counting S o r t Sort Sort):计数排序是一种非比较排序算法。它通过确定每个元素在排序后的序列中的位置,来实现排序。计数排序的时间复杂度为 O ( n + k ) O(n+k) O(n+k),其中k是待排序数组中的最大值。计数排序适用于元素范围较小的情况。

  • 桶排序 B u c k e t Bucket Bucket S o r t Sort Sort):桶排序也是一种非比较排序算法。它将待排序元素分到不同的桶中,对每个桶中的元素进行排序,然后按照桶的顺序将元素合并起来。桶排序的时间复杂度取决于桶的数量和每个桶内使用的排序算法。

  • 基数排序 R a d i x Radix Radix S o r t Sort Sort):基数排序是一种非比较排序算法。它根据元素的位数,将待排序元素按照位数从低到高进行排序。基数排序可以使用稳定的排序算法作为每个位数的排序算法,如计数排序或桶排序。

排序算法分析

很快的排序

我们发现,很快的排序,例如:桶排序基数排序它们的代码都比较复杂,一般能不用就不用。

较快的排序

而较快的排序,例如:归并排序堆排序(之所以不放快排 是因为快排实在是太不稳定了!!!),它们的代码也比较复杂(优先队列当我没说),如果使用优先队列有不方便访问,因此能不用就不用。
注:有时优先队列是很方便的。

中等的排序

中等的排序,如:希尔排序快速排序有时速度无法满足要求,并且代码也属于复杂的范畴。

很慢的排序

很慢的排序,如:冒泡排序选择排序虽然代码简短好记,但是速度实在是太慢了!!!!!!

分析的结果

0.没有要求

如果没有特殊要求的话,用优先队列进行堆排是不错的选择,另外还可以用 s o r t sort sort函数排序

1.对速度有要求

如果对速度有要求的话,建议用优先队列进行堆排,也可以用 s o r t sort sort函数排序。

说了跟没说一样

2.边排序边操作

如果要在排序中操作,建议使用各种较慢的排序算法,这样方便理解以及更改。

3.条件1&条件2

这样的话就最好用归并排序了!!这是一种优秀的排序算法,并且稳定,可以在大部分情况下使用

4.在有序数中操作

这样建议使用插入排序,因为插入排序本身就是维护一个有序数列,这样的话方便快捷!

5.条件1&条件4

插入排序优化——超越归并排序的超级算法!!

详见我的神奇博客:史上最快的插入排序文章来源地址https://www.toymoban.com/news/detail-665343.html

到了这里,关于排序算法&分析——什么时候 用 什么排序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构】排序算法复杂度 及 稳定性分析 【图文详解】

    前面给大家讲述了各大排序算法的原理、思路以及实现步骤、代码码源,下面让我们来对比一下各大排序之间的算法复杂度以及稳定性分析优劣,加深我们对于各排序算法的理解,帮助我们以后能更快的在具体场景下选择出最适的排序算法。 【数据结构】冒泡排序 (码源实

    2024年02月05日
    浏览(94)
  • 【数据分析专栏之Python篇】五、pandas数据结构之Series

    大家好!本期跟大家分享的知识是 Pandas 数据结构—Series。 Series 是一种类似于一维数组的对象,由下面两部分组成: values :一组数据,ndarray 类型 index :数据索引 顾名思义 ,我们在创建 Series 对象时,需要传递一组数据,该数据大多数时候是可迭代对象。因此,下面三种创

    2024年02月14日
    浏览(56)
  • 【C++图解专栏】手撕数据结构与算法,探寻算法的魅力

    ✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343 📣专栏定位:为 0 基础刚入门数据结构与算法的小伙伴提供详细的讲解,也欢迎大佬们一起交流~ 📚专栏简介:在这个专栏,我将带着大家一起用 C++ 手撕基础的数据结构与算法,每一讲都有详细的讲解,29 篇文章共

    2024年02月09日
    浏览(57)
  • 【Java程序员面试专栏 数据结构】四 高频面试算法题:哈希表

    一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,一个O(1)查找的利器哈希表,所以放到一篇Blog中集中练习 题目 解题思路 时间 空间 两数之和 辅助哈希 使用map存储出现过的值,key为值大小,v

    2024年02月22日
    浏览(55)
  • 【数据结构与算法】排序算法(选择排序,冒泡排序,插入排序,希尔排序)

    基本概念这了就不浪费时间解释了,这四种都是很简单的排序方式,本专栏后续文章会出归并排序,计数排序,快速排序,堆排序,桶排序等排序算法,今天这篇文章中给出选择排序,冒泡排序,插入排序和希尔排序的实现; 如果发现文章中有错误,还请大家指出来,我会非

    2024年02月15日
    浏览(81)
  • 数据结构和算法笔记4:排序算法-归并排序

    归并排序算法完全遵循分治模式。直观上其操作如下: 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。 解决:使用归并排序递归地排序两个子序列。 合并:合并两个已排序的子序列以产生已排序的答案。 我们直接来看例子理解算法的过程,下面是要排序

    2024年01月21日
    浏览(62)
  • 【数据结构与算法】十大经典排序算法-希尔排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌞 知乎 :HelloCode 🌴 掘金 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 希尔排序是一种插入排序的改进版本,旨在解决插入排序在处理大规模数据时的效率问题。通过将数组分为多个子序列并对

    2024年02月12日
    浏览(75)
  • 【数据结构与算法】十大经典排序算法-插入排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌞 知乎 :HelloCode 🌴 掘金 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 插入排序(Insertion Sort)是一种简单直观的排序算法,其基本思想是将一个记录插入到已排好序的有序序列中,直到所有记录

    2024年02月13日
    浏览(80)
  • 【数据结构与算法】十大经典排序算法-冒泡排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌴 掘金 :HelloCode 🌞 知乎 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 冒泡排序(Bubble Sort)是一种简单的排序算法,它通过重复地交换相邻元素的位置来将最大(或最小)的元素逐步“冒泡”到

    2024年02月14日
    浏览(69)
  • 【数据结构与算法】十大经典排序算法-快速排序

    🌟 个人博客: www.hellocode.top 🏰 Java知识导航: Java-Navigate 🔥 CSDN: HelloCode. 🌞 知乎 :HelloCode 🌴 掘金 :HelloCode ⚡如有问题,欢迎指正,一起学习~~ 快速排序(Quick Sort)是一种高效的排序算法,是对冒泡排序的优化。它采用分治法(Divide and Conquer)的思想,将待排序序列

    2024年02月13日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包