对于相同大小的数组,排序算法(Merge,Quick)的性能是否会因重复元素而降低。
我可以说var arr = [6,4,7,1,8,3,9,2,10,5]; --> Sorts faster because of unique elements
var arr = [1,1,3,3,3,2,4,4,5,10]; --> Slower because repeated elements
我尝试编写一个简单的quicksort实现,它给了我上面提到的行为。我做错了吗
var Quicksort = function(arr, si, ei) {
if (si >= ei) return;
var pivot = arr[ei];
var pi = si;
for (var i = si; i < ei; i++) {
if (arr[i] < pivot) {
Swap(arr, pi, i);
pi++;
}
}
Swap(arr, pi, ei);
Quicksort(arr, 0, pi - 1);
Quicksort(arr, pi + 1, ei);
return arr;
}
function Swap(arr, i, j) {
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
// Execute
var input = [];
for (var i = 0; i < 1000; i++) {
input.push(Math.floor(Math.random() * 100000));
}
console.log(input);
var result = Quicksort(input, 0, input.length - 1);
console.log(result);
谢谢
答案 0 :(得分:0)
相等或不同值的数量不会影响合并或快速排序的效率。
影响快速排序效率的因素是您如何选择数据透视值以及数组是否已经排序。
阅读:http://www.geeksforgeeks.org/when-does-the-worst-case-of-quicksort-occur/
当谈到mergesort时,影响其效率的因素是你在合并阶段最终做了多少次比较。
阅读:When will the worst case of Merge Sort occur?
因此,数字的频率不会影响排序算法。
当然,假设你有一个大小为n的数组,其中所有值都等于x,quicksort将表现良好,因为数组已经被排序了。
喜欢:[6,6,6,6,6],快速排序会在n²中表现出来。
我相信还有其他排序算法可以更好地处理值重复很多的数组,我会说计数排序(http://www.geeksforgeeks.org/counting-sort/)将是一个很好的方法。