【JavaScript】先頭要素の位置を維持したまま整数配列をソートする方法
本記事では、数値の配列を受け取り、特定のルールに従って並べ替えるJavaScript関数の実装方法を解説します。
並べ替えのルール
今回実装する関数は、以下の条件を満たす必要があります。
- 配列の先頭要素(array[0])は元の位置に固定する
- 先頭要素より大きい整数がある場合は、その直後に配置する
- 残りの整数は、最小値から昇順に並べる
入力と出力の例
例として、次の配列を考えてみましょう。
const arr = [10, 7, 12, 3, 5, 6];この場合、期待される出力は以下の通りです。
const output = [10, 12, 3, 5, 6, 7];先頭の「10」はそのままの位置に留まり、それより大きい「12」が直後に続き、残りの「3, 5, 6, 7」が昇順で並んでいることが確認できます。
コード例
const arr = [10, 7, 12, 3, 5, 6];
const uniqueSort = (arr = []) => {
const first = arr[0];
const sorter = (a, b) => {
return (a < first) - (b < first) || a - b;
};
arr.sort(sorter);
};
uniqueSort(arr);
console.log(arr);出力結果
[10, 12, 3, 5, 6, 7]コードの解説
このソート処理の仕組みを順番に見ていきましょう。
- まず、変数firstに配列の先頭要素を保存し、比較の基準値として固定します。
- 比較関数sorter内の「(a < first) - (b < first)」という式により、先頭要素より小さい要素を後ろのグループへ移動させます。JavaScriptではブール値同士の減算時にtrueが1、falseが0として扱われるため、このテクニックが成立します。
- 両者が同じグループ(先頭要素以上か未満か)に属する場合は、「|| a - b」の部分が評価され、通常の数値による昇順ソートが実行されます。
注意点
Array.prototype.sort()は元の配列を直接変更(破壊的操作)するメソッドです。元の配列を後続の処理でも使いたい場合は、スプレッド構文などで事前にコピーを作成してからソートすることをおすすめします。
-
JavaScriptで実装するマージソートとクイックソートの徹底解説
マージソート(Merge Sort)とは マージソートは、分割統治法(Divide and Conquer)に基づいたソートアルゴリズムです。最悪計算量は O(n log n) と非常に効率的ですが、その代償として追加の O(n) のメモリ領域が必要になるという特徴があります。 ここでは、このアルゴリズムを2つの関数、mergeSort と merge を作成して実装していきます。 merge(マージ) ― 2つの引数(部分的にソートされた2つの配列)を受け取り、要素を正しい順序で挿入しながら1つの配列に結合する関数です。 mergeSort(マージソート) ― 配列の左半分と右半分に対し
-
JavaScriptのArray.prototype.sort()メソッドの使い方をサンプルコードで解説
Array.prototype.sort()は、JavaScriptで配列の要素を並べ替えるための組み込みメソッドです。アルファベット順・数値順といった並び方に加えて、昇順・降順も自由に指定でき、配列操作の中でも特に使用頻度の高いメソッドの一つです。 ただし重要なポイントとして、sort()メソッドはデフォルトではすべての要素を文字列に変換してから比較します。そのため、数値の配列を意図したとおりに並べ替えたい場合は、比較関数を引数として渡す必要があります。 以下は、Array.prototype.sort()メソッドの基本的な使い方を示すサンプルコードです。 サンプルコード <!DOC