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

news/2024/11/17 3:55:02/

排序算法 & 分析

  • 排序算法历史
  • 排序算法分析
    • 很快的排序
    • 较快的排序
    • 中等的排序
    • 很慢的排序
  • 分析的结果
    • 0.没有要求
    • 1.对速度有要求
    • 2.边排序边操作
    • 3.条件1&条件2
    • 4.在有序数中操作
    • 5.条件1&条件4

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

排序算法历史

纵观排序算法的历史,有哪些排序算法的速度可以到达 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

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

详见我的神奇博客:史上最快的插入排序


http://www.ppmy.cn/news/1043718.html

相关文章

【实战】十一、看板页面及任务组页面开发(二) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(二十四)

文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…

画质提升+带宽优化,小红书音视频团队端云结合超分落地实践

随着视频业务和短视频播放规模不断增长,小红书一直致力于研究:如何在保证提升用户体验质量的同时降低视频带宽成本? 在近日结束的音视频技术大会「LiveVideoStackCon 2023」上海站中,小红书音视频架构视频图像处理算法负责人剑寒向…

P6685 可持久化动态仙人掌的直径问题

思路1&#xff1a;二分快速幂 #include<bits/stdc.h> using namespace std; #define int long long int n,m; bool check(int a,int b){int ans1;while(b){if(a>n)return false;if(b&1)ans*a;if(ans>n)return false;aa*a;b>>1;}return ans<n; } voi…

RCE远程命令执行

逻辑运算符:: &&&#xff1a;代表首先执行命令a&#xff0c;若成功再执行命令b&#xff0c;又被称为短路运算符。 &&#xff1a;代表首先执行命令a再执行命令b&#xff0c;不管a是否成功&#xff0c;都会执行命令b。在执行效率上来说“&&”更加高效。 ||&a…

SOLIDWORKS 2023中装配体配合的正确使用方法 硕迪科技

-SOLIDWORKS 装配体打开时是由不同的阶段和性能检查组成的。如果在创建装配体时未应用基本的配合方法&#xff0c;问题会随着时间的推移而累积&#xff0c;并且在使用时会出现明显的速度减慢。 如果您的装配体运行速度很慢&#xff0c;则很可能是在创建配合时出现了不良操作的症…

AI 媒人:为什么图形神经网络比 MLP 更好?

一、说明 G拉夫神经网络&#xff08;GNN&#xff09;&#xff01;想象他们是人工智能世界的媒人&#xff0c;通过探索他们的联系&#xff0c;不知疲倦地帮助数据点找到朋友和人气。数字派对上的终极僚机。 现在&#xff0c;为什么这些GNN如此重要&#xff0c;你问&#xff1f;好…

C++入门:命名空间与输入输出

目录 1.命名空间 1.1 命名空间的定义 1.2 命名空间的使用 1.3 标准命名空间 std 2.C输入输出 我们在初学C时&#xff0c;经常会在代码开头看到这样的一行代码&#xff1a; using namespace std; 这行代码到底什么意思呢&#xff1f;我们学完命名空间就可以理解了。 1.命…

菜单中的类似iOS中开关的样式

背景是我们有需求&#xff0c;做类似ios中开关的按钮。github上有一些开源项目&#xff0c;比如 SwitchButton&#xff0c; 但是这个项目中提供了很多选项&#xff0c;并且实际使用中会出现一些奇怪的问题。 我调整了下代码&#xff0c;把无关的功能都给删了&#xff0c;保留核…