1 高速分拣(QuickSort)
高速的排序是一个地方排序,分而治之。海量递归算法。从本质上讲,合并排序地方是版本号。
的以下四个步骤的高速排序可以由。
(1) 不多于1个数据。直接返回。
(2) 一般选择序列最左边的值作为支点数据。
(3) 将序列分成2部分。一部分都大于支点数据,另外一部分都小于支点数据。
(4) 对两边利用递归排序数列。
高速排序比大部分排序算法都要快。
虽然我们能够在某些特殊的情况下写出比高速排序快的算法,可是就通常情况而言。没有比它更快的了。高速排序是递归的,对于内存很有限的机器来说,它不是一个好的选择。
2 归并排序(MergeSort)
归并排序先分解要排序的序列,从1分成2。2分成4,依次分解,当分解到仅仅有1个一组的时候,就能够排序这些分组,然后依次合并回原来的序列中。这样就能够排序全部数据。合并排序比堆排序略微快一点,可是须要比堆排序多一倍的内存空间。由于它须要一个额外的数组。
3 堆排序(HeapSort)
堆排序适合于数据量很大的场合(百万数据)。
堆排序不须要大量的递归或者多维的暂存数组。
这对于数据量很巨大的序列是合适的。比方超过数百万条记录。由于高速排序,归并排序都使用递归来设计算法,在数据量很大的时候。可能会发生堆栈溢出错误。
堆排序会将全部的数据建成一个堆,最大的数据在堆顶,然后将堆顶数据和序列的最后一个数据交换。接下来再次重建堆。交换数据,依次下去,就能够排序全部的数据。
4 Shell排序(ShellSort)
Shell排序通过将数据分成不同的组。先对每一组进行排序,然后再对全部的元素进行一次插入排序。以降低数据交换和移动的次数。平均效率是O(nlogn)。当中分组的合理性会对算法产生重要的影响。
如今多用D.E.Knuth的分组方法。
Shell排序比冒泡排序快5倍,比插入排序大致快2倍。Shell排序比起QuickSort,MergeSort。HeapSort慢非常多。可是它相对照较简单,它适合于数据量在5000下面而且速度并非特别重要的场合。它对于数据量较小的数列反复排序是非常好的。
5 插入排序(InsertSort)
插入排序通过把序列中的值插入一个已经排序好的序列中,直到该序列的结束。插入排序是对冒泡排序的改进。它比冒泡排序快2倍。一般不用在数据大于1000的场合下使用插入排序,或者反复排序超过200数据项的序列。
6 冒泡排序(BubbleSort)
冒泡排序是最慢的排序算法。
在实际运用中它是效率最低的算法。它通过一趟又一趟地比較数组中的每个元素。使较大的数据下沉,较小的数据上升。
它是O(n^2)的算法。
7 交换排序(ExchangeSort)和选择排序(SelectSort)
这两种排序方法都是交换方法的排序算法。效率都是 O(n2)。在实际应用中处于和冒泡排序基本同样的地位。它们仅仅是排序算法发展的0基础阶段。在实际中使用较少。
8 基数排序(RadixSort)
基数排序和通常的排序算法并不走相同的路线。
它是一种比較新颖的算法,可是它仅仅能用于整数的排序,假设我们要把相同的办法运用到浮点数上。我们必须了解浮点数的存储格式。并通过特殊的方式将浮点数映射到整数上,然后再映射回去,这是很麻烦的事情。因此。它的使用相同也不多。
并且。最重要的是。这样算法也须要较多的存储空间。
9 总结
以下是一个总的表格。大致总结了我们常见的全部的排序算法的特点。
排序法 |
平均时间 |
最差情形 |
稳定度 |
额外空间 |
备注 |
冒泡 |
O(n2) |
O(n2) |
稳定 |
O(1) |
n小时较好 |
交换 |
O(n2) |
O(n2) |
不稳定 |
O(1) |
n小时较好 |
选择 |
O(n2) |
O(n2) |
不稳定 |
O(1) |
n小时较好 |
插入 |
O(n2) |
O(n2) |
稳定 |
O(1) |
大部分已排序时较好 |
基数 |
O(logrd) |
O(logrd) |
稳定 |
O(n) |
d是keyword项数(0-9)。 r是基数(个十百) |
Shell |
O(nlogn) |
O(ns) 1<s<2 |
不稳定 |
O(1) |
s是所选分组 |
高速 |
O(nlogn) |
O(n2) |
不稳定 |
O(nlogn) |
n大时较好 |
归并 |
O(nlogn) |
O(nlogn) |
稳定 |
O(1) |
n大时较好 |
堆 |
O(nlogn) |
O(nlogn) |
不稳定 |
O(1) |
n大时较好 |
版权声明:本文博主原创文章。博客,未经同意不得转载。