Есть ли встроенная функция 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 самых маленьких элементов на данный момент, используя бинарный поиск для вставки новых элементов.
Пожалуйста, опубликуйте альтернативные решения, если вы думаете, что они могут быть быстрее или элегантнее. Сроки очень приветствуются.