常见排序算法(零)(各类排序算法总结与比较)

相关文章:

常见排序算法(零)(各类排序算法总结与比较)

常见排序算法(一)(冒泡排序、插入排序)

常见排序算法(二)(选择排序)

常见排序算法(三)(快速排序、归并排序、计数排序)

常见排序算法(四)(基数排序、桶排序)


常见的排序算法有以下几种:冒泡排序(BubbleSort)、选择排序(Selection Sort)、插入排序(Insertion Sort)、快速排序(Quick Sort)、归并排序(Merge Sort)、计数排序(Counting Sort)、基数排序(Radix Sort)、桶排序(Bucket Sort)。每种排序的时间复杂度和空间复杂度,所适用的数据集,具体适用的情况会有所不同,先通过一个表来认识这几种排序:

名称

时间复杂度

空间复杂度

稳定性

适用范围

最优

最差

平均

冒泡

排序

直接冒泡排序

O(n²)

O(n²)

O(n²)

O(1)

稳定

实数

改进版冒泡排序

O(n)

O(n²)

O(n²)

O(1)

稳定

实数

选择

排序

直接选择排序

O(n²)

O(n²)

O(n²)

O(1)

不稳定

实数

树形选择排序

O(nlogn)

O(nlogn)

O(nlogn)

O(n)

稳定

实数

堆排序

O(nlogn)

O(nlogn)

O(nlogn)

O(1)

不稳定

实数

插入

排序

直接插入排序

O(n)

O(n2)

O(n2)

O(1)

稳定

实数

二分插入排序

O(n)

O(n2)

O(n2)

O(1)

稳定

实数

希尔排序

O(n)

O(n2)

O(n1.5)*

O(1)

不稳定

实数

快速排序

O(nlogn)

O(n2)

O(nlogn)

O(n)

不稳定

实数

归并排序

O(nlogn)

O(nlogn)

O(nlogn)

O(n)

稳定

实数

计数排序

/

/

O(n + k)

O(n + k)

不稳定

整数

基数

排序

最低位优先排序

O(d(n+ rd))

O(d(r+ n))

O(d(n+ rd))

O(rd+ n)

稳定

自然数

最高位优先排序

桶排序

O(n)

**

 

O(d + n)

***

实数

计数排序中n指的是关键字的个数,k指的是最大关键字与最小关键字的差值。

基数排序中r代表关键字的基数,d代表最大数据的长度,n代表关键字的个数。

*希尔排序的平均时间复杂度取决于增量的选取

**桶排序的最差时间复杂度取决于桶中的排序算法

***桶排序的稳定性取决于桶中的排序算法


       最简单的排序是冒泡排序,插入排序,直接选择排序,这三种排序算法实现简单,逻辑易懂,不涉及递归,不占用多余空间,但是效率较低,平均时间复杂度全部为O(n2),因此在实际运用中很少见。在一些不追求效率,小范围的排序中可以使用这几种排序。

       基于比较的排序算法最优时间复杂度为O(nlogn),快速排序,归并排序,堆排序的平均时间复杂度可以达到这个时间复杂度,三者之间相互比较,从空间复杂度看,占用空间最大的是归并排序,需要2n的多余空间,快速排序需要n的多余空间,堆排序不需要多余空间,从这点上看,堆排序要优于其它两种排序算法。并且堆排序在任何情况下的时间复杂度都是O(nlogn),在任何情况下都可以用最短的时间完成排序,比快速排序的时间要稳定,所以理论上是三者中最优的算法。

       但堆排序的缺点在于当堆中的一个数据发生改变,整个堆都需要进行调整以维护堆的性质,需要额外的维护开销,由于在实际运用中,数据变动是很频繁的,所以实际上堆排序不是很适合实际的运用。

       归并排序虽然占用空间大,但是任何情况下的时间复杂度都为O(nlogn),表现稳定,并且当数据分段有序时,表现会优于快速排序,因此当数据量不大时,可以选择归并排序。

       实际运用中快速排序运用最广泛的原因在于,占用空间小,平均时间复杂度低,虽然在最差情况下会达到O(n2),并且在很多数据相等的情况下迭代层次会增加,但在大多数情况下,以上两种情况(逆序,大量数据相等)很少出现,综合考虑下,快速排序是基于比较的排序中较优的一种选择。

       不基于比较的排序算法有计数排序和基数排序,这两种排序有天生的缺陷,计数排序只能对整数排序,基数排序只能对自然数排序,大大限制了它们的应用范围。这两种排序中计数排序是明显要优于基数排序的,计数排序占用空间小,大部分情况下时间复杂度比基数排序低。但是计数排序是一种不稳定的排序算法,如果对稳定性有要求的话还是要选择基数排序。有一点要注意的是,基数排序,特别是最高位优先排序,辅助空间大,在数据量较大是可能会造成内存不足。

       计数排序和快速排序来比较,个人感觉在待排序数组全为整数,并且最大值与最小值之差不是特别大的时候时,计数排序会优于快速排序,尤其是在相等的数很多的情况下,计数排序表现更佳。


  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值