我有多个对象,字段名为“ num”。Num可以是1000000000到10000000005之间的任何数字。我想确保如果我有x个列表,则所有列表都需要基于“ num”属性以升序排列在array1中。
如果我从这样的数组开始,
array1": [{item:23532532, num:1000000520},{item:23523, num:1000000620},{item:346346432, num:1000000620}]
我有第二个数组
"array2": [{item:23532, num:....},{item:3623, num:....}]
假设array2按“ num”排序,这样做是否更有效:
1)添加然后排序整个-遍历“ array2”中的每个项目并将其添加到“ array1”的末尾,然后在整个数组的“ num”属性上执行“ sort”函数中内置的javascript吗?
2)插入到正确的位置-循环遍历“ array2”中的每个项目,并使用“ if”条件检查“ num”值是否大于“ array2”中的当前项目,如果是,则在前面插入元素该索引通过“拼接”。(未使用javascript内置数组排序)
还是有更有效的方法?伪代码或示例代码是一个加号。
我在三种不同的浏览器中测量了三种不同算法的结果。
关于所有与性能相关的问题,有两件事是正确的:
如果您真的想知道答案,则必须在多个浏览器中测试特定的算法才能真正回答问题。
实际上,许多与性能相关的问题在使用它们的给定上下文中并不重要,因此担心它们,直到您知道需要担心它们,这不过是浪费在过早优化甚至不必要的优化上的时间。因此,在进行特定领域的性能研究之前,您应该知道这很重要,并且值得花时间在上面。
也就是说,这里是对三种算法的一些测量。假定您从两个对象数组开始,每个对象数组由每个对象中存在的一个特定数字属性独立排序。
这是jsperf:http : //jsperf.com/concat-sort-vs-insert-sort/5 ,其中包含三种算法的代码。
算法1是串联的,然后对串联的数组进行排序。在JS中,无非是:
var result = arr1.concat(arr2);
result.sort(sortByNum);
算法2是对插入排序的尝试。基本思想是遍历第二个数组,并为该数组中的每个项目找到将其插入第一个数组的位置。由于两个数组都已排序,因此我们只需要开始寻找一个位置,即可在插入最后一个项目之后的位置将下一个项目插入第一个数组。
算法3是合并排序。这里的想法是创建一个空的结果数组和两个索引,两个源数组中的每个索引一个。对于每个源索引处的值,将结果推入两个项目中的较低者,然后增加其源索引。当任一源索引用尽时,您将推入另一个数组的其余部分。我猜想它会比插入排序更有效,因为它不必将项目插入数组的中间,而只需添加到末尾,这可能会更快。
为了运行测试,我创建了两个数组,每个数组包含100个对象。每个对象都有一个数字属性,该属性被分配一个0到100,000之间的随机数。然后,对两个源阵列中的每一个进行预排序。然后,在这两个源数组上测试每种算法。
并且,结果如下:
这是合并排序算法的代码:
function mergeSort(arr1, arr2) {
var result = [];
var index1 = 0;
var index2 = 0;
if (!arr1.length) {
return arr2.slice(0);
} else if (!arr2.length) {
return arr1.slice(0);
}
while (true) {
if (arr1[index1].num <= arr2[index2].num) {
result.push(arr1[index1]);
++index1;
// see if we reached the end of the array
if (index1 >= arr1.length) {
result.push.apply(result, arr2.slice(index2));
break;
}
} else {
result.push(arr2[index2]);
++index2;
// see if we reached the end of the array
if (index2 >= arr2.length) {
result.push.apply(result, arr1.slice(index1));
break;
}
}
}
return result;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句