排序算法--排序算法综述

17 篇文章 15 订阅
10 篇文章 3 订阅

一、算法复杂度以及稳定性分析

算法名称平均时间辅助时间稳定性
冒泡排序O(n2)O(1)
选择排序O(n2)O(1)
插入排序O(n2)O(1)
自底向上归并排序O(nlog2n)O(n)
自顶向下归并排序O(nlog2n)O(n)
快速排序O(nlog2n)O(n)
堆排序O(nlog2n)O(1)
基数排序O(dn)O(m)
希尔排序\O(1)

二、排序的时间效率比较

下图表明了各种算法在不同数据规模下,完成排序所消耗的时间(毫秒为单位),从表中可以显然看出O(n2)的排序算法比O(nlog2n)的算法时间多出几百上千倍,而且随着数据规模增大时间比也会随着增大;因为排序的数据采用随机数,顺序将被打乱,快速排序算法优先于其他排序算法。

算法名称1万3万5万10万平均时间复杂度
冒泡排序14421220634017139071O(n^2)
选择排序1991790506219643O(n^2)
插入排序1781628445817914O(n^2)
自底向上归并排序391533O(n log n)
自顶向下归并排序3111840O(n log n)
快速排序281432O(n log n)
堆排序3121937O(n log n)
基数排序9304998O(n)
希尔排序3112441O(n^1.25)

三、快速排序(QuickSort)

快速排序是一个就地排序,分而治之,大规模递归地算法。从本质上来说,它是归并排序的就地版本。快速排序可以由下面四步组成。

  1. 如果不多于1个数据,直接返回。
  2. 一般选择序列最左边的值作为支点数据。
  3. 将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据。
  4. 对两边利用递归排序数列。

快速排序比大部分排序算法都要快。尽管我们可以在某些特殊的情况下写出比快速排序快的算法,但是就通常情况而言,没有比它更快的了。快速排序是递归地=的,对于内存非常有限的机器来说,它不是一个好的选择。

四、归并排序(MergeSort)

归并排序先要分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。

五、堆排序(HeapSort)

堆排序适合于数据量非常大的场合(百万数据)。

堆排序不需要大量的递归或者多维的暂存数组。这对于数据量非常巨大的序列是合适的。比如超过数百万条记录,因为快速排序,归并排序都使用递归来设计算法,在数据量非常大的时候,可能会发生堆栈溢出错误。

堆排序会将所有的数据建成一个堆,最大的数据在堆顶,然后将堆顶数据和序列的最后一个数据交换。接下来再次重建堆,交换数据,依次下去,就可以排序所有的数据。

六、Shell排序(ShellSort)

Shell排序通过将数据分成不同的组,先对一组进行排序,然后在对所有的元素进行一次插入排序,以减少数据交换和移动的次数。平均效率是O(nlogn)。其中分组的合理性会对算法产生重要的影响。现在多用D.E.Knuth的分组方法。

Shell排序比冒泡排序快5倍,比插入排序大致快2倍。Shell排序比起QuickSort,MergeSort,HeapSort慢很多,但是它相对比较简单,它适合于数据量在5000以下并且速度并不是特别重要的场合。它对于数据量较小的数列重复排序是非常好的。

七、插入排序(InsertSort)

插入排序通过把序列中的值插入一个已经排序好的序列中,直到该序列的结束。插入排序是对冒泡排序的改进。它比冒泡排序快2倍。一般不用在数据大于1000的场合,或者重复排序超过200的数据项的序列。

八、冒泡排序(BubbleSort)

冒泡排序是最慢的排序算法。在实际运用中它是效率最低的算法。她通过一趟又一趟地比较数组中的每一个元素,使较大的数据下沉,较小的数据上升。它是O(n^2)的算法。

九、交换排序(ExchangeSort)和选择排序(SelectSort)

这两种排序方法都是交换方法的排序算法,效率都是O(n^2)。在实际应用中处于和冒泡排序基本相同的地位。他们只是排序算法发展的初级阶段,在实际中使用较少。

十、基数排序(RadixSort)

基数排序和通常的排序算法并不走同样的路线。它是一种比较新颖的算法,但是他只能用于整数的排序,如果我们要把同样的办法运用到浮点数上,我们必须了解浮点数的存储格式,并通过特殊的方式将浮点数映射到整数上,然后再映射回去,这是非常麻烦的事情,以此,他的使用同样也不多。而且,最重要的是,这样的算法也需要较多的存储空间。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值