如何实现高效的排序算法?
空间复杂度:
不是原地排序的算法,需要注意数据量是不是很大,如果100M的数据,突然多出100M的临时空间申请,这相当于需
要多出一倍的空间量,不太合适用非原地排序算法。
稳定性:
如果数据要求稳定的排序,那么要排除不稳定的排序。
时间复杂度:
有特殊需求的可以使用桶排序、计数排序和基数排序。数据量比较大时,如果内存不做限制,那么归并排序好,快速排序,因为分割数选的不好时,时间复杂度有可能退化为O(n2)。数据量非常小时,可以考虑插入排序,因为数据量小时,时间复杂度为O(n2)不一定比O(logn)执行慢。
时间复杂度O(n2)执行比O(logn)的情况?
假设 k=1000,c=200,当我们对小规模数据(比如 n=100)排序时,n2的值实际上比 knlogn+c 还要小。
knlogn+c = 1000 * 100 * log100 + 200 远大于10000
n^2 = 100*100 = 10000
如何优化快速排序?
1,三数取中法。取首尾中3个数比较,取中间值的分割数。数据量大时,可以取5,10个数取中都可以。
2,随机法。每次的分割数随机取,概率学来说,不可能每次都是最大,或者最小。
综合来说是快速排序好点。