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

JavaScriptで配列を最大・最小交互に並べ替える方法

はじめに

本記事では、数値の配列を受け取り、要素を「最大値、最小値、2番目に大きい値、2番目に小さい値…」という順序で並べ替える関数 minMax() をJavaScriptで実装する方法を解説します。

要件の整理

まず、期待する動作を具体例で確認しましょう。

// 入力配列:
const input = [1, 2, 3, 4, 5, 6, 7];

// 期待される出力:
const output = [7, 1, 6, 2, 5, 3, 4];

最大値の7が先頭に来て、その後は最小値の1、次に大きい6、次に小さい2というように、大きい値と小さい値が交互に配置されます。

実装コード

それでは、この関数の完全なコードを見てみましょう。

const input = [1, 2, 3, 4, 5, 6, 7];

const minMax = arr => {
    const array = arr.slice();
    array.sort((a, b) => a - b);
    for(let start = 0; start < array.length; start += 2){
        array.splice(start, 0, array.pop());
    }
    return array;
};

console.log(minMax(input));

実行結果

コンソールには次の出力が表示されます。

[
    7, 1, 6, 2,
    5, 3, 4
]

コードの仕組み

処理の流れを順番に見ていきましょう。

  1. 元の配列を保護: slice() で入力配列のコピーを作成し、元の配列が変更されないようにしています。
  2. 昇順ソート: sort((a, b) => a - b) により配列を小さい順に並べ替えます。これで最大値が必ず末尾に位置します。
  3. 交互に挿入: ループ内で pop() によって末尾(現時点での最大値)を取り出し、splice() を使って偶数インデックス(0, 2, 4…)の位置に挿入します。これを繰り返すことで、最大値と最小値が交互に並ぶ形になります。

なお、この実装ではループごとに splice() による要素の挿入が発生するため、計算量は O(n²) になります。データサイズが大きい場合は、次に紹介する方法が効率的です。

別アプローチ: 双方向ポインタを使った効率化

パフォーマンスを重視する場合は、ソート済み配列の両端から値を取り出して新しい配列を構築する方法がシンプルかつ高速です。計算量は O(n log n)(ソート部分が支配的)に抑えられます。

const input = [1, 2, 3, 4, 5, 6, 7];

const minMax = arr => {
    const sorted = [...arr].sort((a, b) => a - b);
    const result = [];
    let left = 0;
    let right = sorted.length - 1;
    while (left <= right) {
        if (left !== right) {
            result.push(sorted[right--], sorted[left++]);
        } else {
            result.push(sorted[left++]);
        }
    }
    return result;
};

console.log(minMax(input)); // [7, 1, 6, 2, 5, 3, 4]

右側(最大値側)と左側(最小値側)から交互に値を取り出すため、追加の挿入操作が不要になり、要素数が多い配列でも安定した性能を発揮します。

まとめ

この記事では、配列を「最大・最小・2番目に大きい・2番目に小さい…」という順序に並べ替える minMax() 関数の実装方法を紹介しました。sort()pop()splice() を組み合わせたシンプルな手法と、双方向ポインタを使った効率的な手法の2通りを学びました。データサイズや可読性の要件に応じて、適切な実装を選択してください。

  1. JavaScriptのshift()メソッドで配列の先頭要素を削除する方法

    JavaScript の shift() メソッドは、配列の先頭(最初)の要素を取り除くために使用されます。取り除かれた要素は戻り値として返されるため、「削除」と「取得」を同時に行える便利なメソッドです。shift() メソッドの構文array.shift()shift() は引数を必要とせず、呼び出すだけで配列の最初の要素が削除されます。なお、元の配列自体が変更される(破壊的メソッド)点には注意が必要です。また、空の配列に対して shift() を呼び出した場合は undefined が返されます。それでは、実際に shift() メソッドを使ったサンプルコードを見ていきましょう。例1:配列

  2. JavaScriptの配列reverse()メソッドとは?使い方とサンプルコードを解説

    JavaScriptのreverse()メソッドは、配列の要素を逆順に並べ替えるために使用されるメソッドです。呼び出すと元の配列そのものが反転され、その結果の配列が戻り値として返されます。構文array.reverse()reverse()メソッドのポイント引数は不要で、呼び出した配列自体を直接書き換えます(破壊的なメソッド)。戻り値は、要素が反転された配列への参照です。元の配列を変更せずに反転したい場合は、ES2023で追加されたtoReversed()メソッドを使うと便利です。それでは、実際にJavaScriptでreverse()メソッドを実装してみましょう。例1:基本的な使い方<