排序算法对比

算法大类的划分

交换排序: 包括冒泡排序,快速排序。

选择排序: 包括直接选择排序,堆排序。

插入排序: 包括直接插入排序,希尔排序。

归并排序: 包括归并排序

分配排序: 箱排序、基数排序

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

插入排序(InsertSort)
插入排序通过把序列中的值插入一个已经排序好的序列中,直到该序列的结束。插入排序是对冒泡排序的改进。

选择排序(SelectSort)
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

快速排序(QuickSort)
通过快速排序将要排序的数据分为独立的两部分,其中一部分的数据比另外一部分的数据都要小,然后再按照此方法对这两部分数据分别再进行快速排序,整个过程可以递归进行,以此达到整个序列都有序。

性能优缺点:

时间复杂度:快速排序比较特殊,它相当依赖数据的随机性。假设对一个已经排序好的序列进行排序,快速排序的时间复杂度将会退化到O(n²),这是最坏情况。而在最好情况下,每次都能将序列二等分,此时快速排序的时间复杂度为线性对数级O(nlog2n)。所以大部分情况下快速排序性能是比较高的。针对原始快速排序的缺点,扩展出许多快速排序的改进算法,例如平衡快排、外部快排、三向切分快排、三路基数快排等。

空间复杂度:由于通过递归实现,所以对内存是有一定程度的依赖,要注意内存溢出问题。

稳定性:不稳定

例子:JAVA的sort方法对基本类型的排序使用的就是快速排序,超过某个长度可能仍会使用归并,原因不稳定性

归并排序(MergeSort)

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。和快速排序有一定的相似性。同快速排序一样使用递归,所以对内存占用仍然较高,但他是稳定的。

可以用两句话区分:快速是分隔排序分隔排序...,归并是分隔分隔...合并

时间复杂度:时间复杂度为O(nlog₂n) 这是该算法中最好、最坏和平均的时间性能。

空间复杂度:O(n)

稳定性:稳定

例子:java对复杂对象的排序使用的归并排序,当然都是优化过的

堆排序(HeapSort)

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。未使用递归方式,对于数据量较大级别的时候适合使用,数据较小时不适合,因为会在堆建立的时候开销较大。

时间复杂度:O(n*logn)

空间复杂度:O(1)

稳定性:不稳定

希尔排序(ShellSort)

Shell排序通过将数据分成不同的组,先对每一组进行排序,然后再对所有的元素进行一次插入排序,以减少数据交换和移动的次数。是直接插入排序算法的一种更高效的改进版本。

时间复杂度:O(n²)

空间复杂度:O(1)

稳定性:不稳定

算法性能对比如下图

猜你喜欢

转载自my.oschina.net/haitaohu/blog/1825536