部分的なソートを行うための組み込みの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));
アルゴリズムは、指定された配列を1回ウォークスルーし、バイナリ検索を使用して新しい要素を挿入し、これまでにk個の最小アイテムのソートされたリストを追跡します。
より高速またはよりエレガントであると思われる場合は、代替ソリューションを投稿してください。タイミングは大歓迎です。