JavaScriptで配列がソート済みかどうか判定する方法(昇順・降順を問わず対応)
はじめに
JavaScriptでは、数値や文字列などのリテラル値を含む配列を受け取り、その配列がソート済みかどうかを判定する関数が必要になる場面があります。ここでのポイントは、昇順・降順のどちらの並び順でも「ソート済み」とみなすという点です。
つまり、作成する関数は次のような仕様になります。
- 配列が昇順または降順のいずれかに整列していれば
trueを返す - それ以外(未ソートの状態)であれば
falseを返す
実装コード
以下は、昇順・降順のどちらにも対応したソート判定関数の実装例です。
const arr = [1, 3, 56, 87, 99, 102, 144, 255, 456, 788, 999];
const isSorted = arr => {
const { length: l } = arr;
// 要素が0個または1個の場合は常にソート済みとみなす
if (l <= 1) {
return true;
}
let ascending = true; // 昇順フラグ
let descending = true; // 降順フラグ
for (let i = 1; i < l; i++) {
// 前の要素より大きければ降順は成立しない
if (arr[i] > arr[i - 1]) {
descending = false;
}
// 前の要素より小さければ昇順は成立しない
if (arr[i] < arr[i - 1]) {
ascending = false;
}
}
// 昇順または降順のどちらかが成立していればソート済み
return ascending || descending;
};
console.log(isSorted(arr));
出力結果
コンソールには以下のように表示されます。
true
コードの解説
この関数のロジックは非常にシンプルです。
- 要素数のチェック: 配列の長さが1以下の場合、並び替えの余地がないため常に
trueを返します。 - 二つのフラグを用意: 昇順判定用の
ascendingと、降順判定用のdescendingをそれぞれtrueで初期化します。 - 隣接要素の比較: ループで隣り合う要素を順番に比較し、前の要素より大きい値が出現した時点で降順は不成立、逆に小さい値が出現した時点で昇順は不成立としてフラグを更新します。
- 最終判定: ループ終了後、
ascendingまたはdescendingのどちらか一方でもtrueのままなら、配列はソート済みと判断できます。
動作確認:さまざまなケース
別のパターンでも試してみましょう。
console.log(isSorted([9, 7, 5, 3, 1])); // true(降順でソート済み) console.log(isSorted([1, 5, 2, 8])); // false(未ソート) console.log(isSorted([42])); // true(要素が1つのみ) console.log(isSorted([])); // true(空配列) console.log(isSorted([3, 3, 3, 3])); // true(すべて同値もソート済み扱い)
このように、空配列や単一要素の配列、重複値を含む配列など、エッジケースでも正しく動作する堅牢な実装になっています。
まとめ
配列がソート済みかどうかの判定は、昇順用と降順用の二つのフラグを活用することで、一度のループ処理(時間計算量 O(n))で効率的に実装できます。データのバリデーションや入力チェックなど、実際の開発現場でも役立つテクニックなので、ぜひ覚えておきましょう。
-
【JavaScript】ユーザーが入力した文字列が配列に含まれているかチェックする方法
本記事では、ユーザーに文字列を入力してもらうための入力欄を備えたJavaScriptプログラムを作成します。 プログラムは、入力された値が、あらかじめコード内で定義しておいた配列の要素と一致するかどうかを判定します。入力された文字列が配列内に存在すれば画面に「true」を、存在しなければ「false」を表示します。 実装例 この動作を実現するコードは以下のとおりです。 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &nb
-
JavaScriptでソート済み配列の各要素の二乗を昇順に求める方法
問題昇順にソートされた整数の配列 arr を引数として受け取るJavaScript関数を作成する必要があります。この関数は、各数値の二乗を計算し、それらも昇順に並べ替えた配列として返さなければなりません。例えば、関数への入力が次のような場合 −const arr = [-2, -1, 1, 3, 6, 8];出力は次のようになります −const output = [1, 1, 4, 9, 36, 64];解法のポイント:二ポインタ法この問題は二ポインタ(Two Pointers)と呼ばれる手法を使うと効率的に解けます。元の配列が昇順にソートされているため、負の数でも絶対値が大きいほど二乗した