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》,仅供学习/参考,谢谢共享