排序算法---排序算法介绍

1.算法复杂度以及稳定性分析

算法名称                        平均时间                         辅助空间                             稳定性

冒泡排序                            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)                                    否

 

2.排序的时间效率比较

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

算法名称                        1万                3万                5万                10万

冒泡排序                         1442            12206            34017            139071

选择排序                         199               1790              5062              19643

插入排序                          178               1628             4458               17914

自底向上归并排序            3                      9                   15                   33

自顶向下归并排序            3                      11                 18                   40

快速排序                           2                      8                  14                   32

堆排序                              3                      12                 19                   37

基数排序                          9                      30                  49                   98

希尔排序                          3                      11                  24                    41

 

各算法的时间复杂度

平均时间复杂度

插入排序 O(n^2)

冒泡排序 O(n^2)

选择排序 O(n^2)

快速排序 O(nlogn)

堆排序 O(nlogn)

归并排序 O(nlogn)

基数排序 O(n)

希尔排序 O(n^1.25)

 

3.快速排序(quicksort)

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

(1)如果不多于1个数据,直接返回

(2)一般选择序列最左边的值作为支点数据

(3)将序列分成2部分,一部分都大于支点数据,另外一部分都小于支点数据

(4)对两边利用递归排序数列

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

 

4.归并排序(mergesort)

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

 

5.堆排序(heapsort)

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

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

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

 

6.shell排序(shellsort)

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

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

 

7.插入排序(insertsort)

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

 

8.冒泡排序(bubblesort)

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

 

9.交换排序(exchangesort)和选择排序(selectsort)

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

 

10.基数排序(radixsort)

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

 

 

此文章内容以及实例来源于《c语言学习app》,仅供学习/参考,谢谢共享

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值