JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで配列からn個の最小値を元の順序のまま取得する方法

問題

数値の配列 arr と整数 n を引数として受け取るJavaScript関数を作成する必要があります。

この関数は、配列 arr から n 個の最小値を取り出しますが、重要なのは「元の配列における相対的な順序を崩してはいけない」という点です。つまり、結果を昇順や降順に並べ替えるのではなく、元の配列で出現した順番どおりに返す必要があります。

解決策のコード例

以下はその実装例です。

const arr = [6, 3, 4, 1, 2];
const num = 3;
const smallestInOrder = (arr = [], num) => {
    if(arr.length < num){
        return arr;
    };
    const copy = arr.slice();
    copy.sort((a, b) => a - b);
    const required = copy.splice(0, num);
    required.sort((a, b) => {
        return arr.indexOf(a) - arr.indexOf(b);
    });
    return required;
};
console.log(smallestInOrder(arr, num));

出力結果

コンソールには次のように表示されます。

[3, 1, 2]

コードの解説

このアプローチの流れは以下の3ステップです。

手順1: 元の配列を破壊しないよう、slice() を使ってコピーを作成します。
手順2: コピーした配列を数値として昇順にソートし、先頭から n 個の最小値を取り出します。
手順3: 取り出した要素を、元の配列内でのインデックス(indexOf())に基づいて並べ替え直すことで、元の順序を復元します。

上記の例では、配列 [6, 3, 4, 1, 2] の中で最も小さい3つの値は 1, 2, 3 ですが、元の配列では 3 → 1 → 2 の順に出現するため、最終的な結果は [3, 1, 2] となります。

補足:重複した値が含まれる場合の注意点

indexOf() は最初に見つかった位置のみを返すため、配列に同じ値が重複して含まれている場合は、意図しない順序になる可能性があります。そのようなケースでは、要素と元のインデックスをセットで管理してから並べ替える方法の方が、より安全かつ確実です。

  1. JavaScriptで挿入ソートを実装して数値配列を昇順に並べ替える方法

    挿入ソートとは挿入ソート(Insertion Sort)は、シンプルで直感的なソートアルゴリズムの一つです。配列を「整列済みの部分」と「未整列の部分」に分け、未整列部分の要素を一つずつ取り出して、整列済み部分の適切な位置に挿入していくことで全体を並べ替えます。データ量が少ない場合や、すでにほぼ整列されたデータに対しては非常に効率的に動作するため、実務でも場面を選んで活用されています。問題の概要今回は、JavaScript関数を作成します。この関数は、第一引数(唯一の引数)として数値の配列 arr を受け取ります。関数の役割は、挿入ソートのアルゴリズムを使用して、この数値配列を昇順(小さい順)に

  2. 指定された配列からn個の最小要素を元の順序で出力するアルゴリズム

    k個の要素からなる配列が与えられたとき、プログラムはその中からn個(ここではk個)の最小要素を見つけ出し、配列に現れた元の順序のまま出力する必要があります。例えば、入力が arr[] = {1, 2, 4, 3, 6, 7, 8} で k=3 の場合、配列の中から3つの最小要素を元の順序で、すなわち 1、次に 2、そして 3 の順に表示します。入力 : arr[] = {1, 2, 4, 3, 6, 7, 8}, k=3 出力 : 1, 2, 3アルゴリズムこの問題は、挿入ソートの考え方を応用することで効率よく解くことができます。基本的な発想は次のとおりです。配列の先頭k個を「暫定の最小k要素