我修改了合并排序,以根据createdAt日期对象进行排序。结果,我只得到了一个有10个元素的数组,然而,起始数组有大约10000个元素。为什么会发生这种情况?我该如何解决这个问题?问题是否源于数组中的重复项?我还尝试过提取resultArray并将其作为参数添加到数组中,在这种情况下,我只得到了一个大约1000个元素的数组。这里的代码合并排序:
function merge(left, right, sorter,) {
let result=[],leftIndex = 0,
rightIndex = 0;
// We will concatenate values into the resultArray in order
while (leftIndex < left.length && rightIndex < right.length) {
if (sorter(left[leftIndex], right[rightIndex])) {
result.push(left[leftIndex]);
leftIndex++; // move left array cursor
} else {
result.push(right[rightIndex]);
rightIndex++; // move right array cursor
}
}
return result.concat(left.slice(leftIndex)).concat(right.slice(rightIndex));
};
function mergeSort(array, sorter = (num1, num2) => num1 < num2, ) {
const half = array.length / 2;
// Base case or terminating case
if (array.length < 2) {
return array;
}
const left = array.splice(0, half);
const right = array.splice(half);
return merge(
mergeSort(left, sorter, ),
mergeSort(right, sorter, ),
sorter,
);
}
这就是我对它的称呼,我把检查哪个日期在另一个日期之前的分类器方法作为一个参数:
const sortedArr = mergeSort(
res,
(obj1, obj2) => {
return new Date(obj1.createdAt) < new Date(obj2.createdAt);
},
)
mergeSort
:中存在两个问题
-
/
运算符不执行integer除法,因此结果可能是非整数,这与数组索引不兼容。更正为:const half = array.length >> 1; // Integer division by 2.
-
splice
会更改使用此方法的数组:它会从数组中删除这些条目。这意味着,第二次调用splice
时,将得到一个空数组或最多一个元素。而是使用slice
。