是否有任何内置的 JavaScript 函数可以进行部分排序?如果没有,什么是实现它的好方法?
给定一个未排序的N个元素数组,我想找到相对于某个加权函数最小的K个元素。K比N小得多,因此对整个数组进行排序并获取前K个元素是低效的。
即使有一些非标准的、依赖于浏览器的东西,我也会很高兴。我仍然可以回退到自定义 JavaScript 实现。
PS:这是我当前的自定义实现(不考虑加权函数,为简单起见仅对元素进行排序):
function bisect(items, x, lo, hi) {
var mid;
if (typeof(lo) == 'undefined') lo = 0;
if (typeof(hi) == 'undefined') hi = items.length;
while (lo < hi) {
mid = Math.floor((lo + hi) / 2);
if (x < items[mid]) hi = mid;
else lo = mid + 1;
}
return lo;
}
function insort(items, x) {
items.splice(bisect(items, x), 0, x);
}
function partialSort(items, k) {
var smallest = [];
for (var i = 0, len = items.length; i < len; ++i) {
var item = items[i];
if (smallest.length < k || item < smallest[smallest.length - 1]) {
insort(smallest, item);
if (smallest.length > k)
smallest.splice(k, 1);
}
}
return smallest;
}
console.log(partialSort([5, 4, 3, 2, 1, 6, 7, 8, 1, 9], 3));
该算法遍历给定数组一次,跟踪到目前为止k最小项的排序列表,使用二进制搜索插入新元素。
如果您认为它们可能更快或更优雅,请发布替代解决方案。时间非常受欢迎。