基于比较的排序问题的计算时间下界为Ω(nlogn)。
合并排序算法(mergeSort)(是渐近最优算法),时间复杂度为O(nlogn)。思路为将数组段二分,直到得到大小为1的n个数组段,将排好序的两个数组合并,依次合并得到排好序的最终数组。其中有递归调用。
自然合并排序(mergeSort的变形)消除了算法中的递归。此算法记录下已经排好序的子串。直接把排好序的数组段放在原数组中。因此,此种算法所需的合并次数较少(即原本是自然顺序的数组段可以不管)。在一些极端情况下可以节省时间。例如,原本就是自然序的长度为n的数组,只需要O(n)的时间。而合并排序仍需O(nlogn)。可以说,自然合并排序比较灵活。
归并排序的非递归实现如下,思想和递归正好相反,原来的递归过程是将待排序集合一分为二,直至排序集合就剩下一个元素位置,然后不断的合并两个排好序的数组。所以非递归思想为,将数组中的相邻元素两两配对。用merge函数将他们排序,构成n/2组长度为2的排序好的子数组段,然后再将他们排序成长度为4的子数组段,如此继续下去,直至整个数组排好序。
关于归并排序详解(非常详尽!)http://blog.csdn.net/sophie_wise8/article/details/7673813
快速排序,以数组中的一个数为基准,比它小的在左边的数组中,比它大的在右边的数组中,这样把左右两边排好序后就得到自然序列。快速排序算法的性能取决于划分的对称性。如果每次划分都是恰好均分,则用时最少,O(nlogn)。如果每次划分都是分成1和n-1,则耗时最多,O(n^2)。通过修改,可以在划分前随机选择基准数,从而可以期望划分是对称的。
线性时间选择(基于快速排序算法而得),当要选择第k小的元素时,先用类似快速排序的方法将数组分为j,n-j两堆,若k小于等于j,则在前面大小为j的数组中按此方法递归找第k个。反之,则在后面大小为n-j的数组中找第k-j个。最坏情况下需要Ω(n^2),但此算法平均性能很好。同样可以随机选择基准。P.S.通过选出合适的基准可以使得在最坏情况下也只用O(n)时间完成。
最接近点对问题,从一维推广到二维。一维:分成相等大小的两堆,找出最接近点对,同分界部分的最小点对比较。时间复杂度θ(nlogn)。