【发布时间】:2014-11-25 16:07:08
【问题描述】:
我的问题是有没有更好的方法来优化下面的代码?每次合并数组时,inversions 会重置并递增,并且在 2 个排序数组(左半边和右半边)的最终合并中,我们得到 inversions 的最终值。在没有全局变量的情况下,有没有更好/更清洁的做事方式?谢谢!
var inversions = 0;
function mergeSortedArray(a, b){
var merged = [],
aElm = a[0],
bElm = b[0],
i = 1,
j = 1,
inversions = 0;
while(aElm || bElm){
if((aElm && !bElm) || aElm < bElm){
merged.push(aElm);
aElm = a[i++];
}
else {
merged.push(bElm);
bElm = b[j++];
inversions++;
}
}
return merged;
}
function mergeSort(items){
if (items.length < 2) {
return items;
}
var middle = Math.floor(items.length / 2),
left = items.slice(0, middle),
right = items.slice(middle);
return mergeSortedArray(mergeSort(left), mergeSort(right));
}
【问题讨论】:
-
您需要
inversions做什么?它是什么意思?我不明白它应该做什么,显然合并排序算法不需要它。 -
@Bergi 当
x > y但x出现在数组中的y之前时,会发生反转。这是计算数组中反转次数的标准高效算法。 -
啊,en.wikipedia.org/wiki/Inversion_(discrete_mathematics) 的链接可能会有所帮助 :-)
-
为什么不简单地传递一个变量并合并它们,即在回溯步骤中将它们加在一起? :)
标签: javascript algorithm mergesort