五种排序算法
选择排序
选择排序两个鲜明的特点:
- 运行时间和输入无关:为了找出最小的元素而扫描一遍数组并不能为下一趟扫描提供任何有用的信息。一个已经有序的数组或者是元素全部相等的元素和一个随机排序的数组所用的排序时间一样长。
- 数据移动是最少的:显然可见,移动数据只发生在是外层循环中。故选择排序只用了N次交换,这是其他大部分算法不具备的。
|
|
插入排序
插入排序和选择排序有一个相同的地方是:当前索引左边的所有元素都是有序的。
与选择排序不同的是:插入排序所需的时间取决于排序数组中元素的初始顺序。例如,一个很大且其中的元素已经(或接近有序)的数组进行排序会比对随机顺序的数组或者是逆序数组(最坏情况)进行来的快。
特点:插入排序对于部分有序的数组十分高效,也很适合于小规模数组。
|
|
希尔排序
希尔排序是一种基于插入排序的快速排序算法。
对于大规模的乱序排序算法,插入排序会很慢,因为它只会交换相邻的元素,因此元素只能一点点地从数组的一端移动到另一端。希尔排序为了加快排序,交换不相邻的元素对数组局部进行排序,并最终用插入排序将局部有序的数组排序。
特点:对于中等大小的数组运行时间可接受。它的代码量小,且不需要额外的内存空间。
|
|
归并排序
将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。
优点:它能够保证将任意长度为N的数组排序所需的时间和NlogN成正比;
缺点:所需额外的辅助空间和N成正比。
|
|
快速排序
快速排序是一种分治的排序算法。它将一个数组分成两个子数组,将两部分独立地排序。快速排序和归并排序是互补的:归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;快速排序则是当两个数组都有序时,整个数组也自然就有序了。
|
|
三向切分的快速排序
优点:三向切分的快速排序比归并排序、标准快速排序和其他排序方法在包括重复元素很多的实际应用中更快。
|
|
冒泡排序
|
|