JavaScriptで配列を波状(ジグザグ)パターンに並べ替える方法
問題
数値の配列 arr を唯一の引数として受け取るJavaScript関数を作成します。この関数は、並べ替え後の配列の要素が次のパターンに従うように並べ替える必要があります。
arr[0] < arr[1] > arr[2] < arr[3]....
このような並べ順は「波状ソート」や「ジグザグソート」と呼ばれることもあります。偶数番目のインデックスの要素は隣接する要素より小さく、奇数番目のインデックスの要素は隣接する要素より大きくなるように配置するのがポイントです。
例として、関数への入力が次の場合を考えてみましょう。
const arr = [1, 5, 1, 1, 6, 4];
このとき、出力は次のようになります(波状パターンを満たす答えは複数存在する場合があります)。
const output = [1, 6, 1, 5, 1, 4];
この結果は 1 < 6 > 1 < 5 > 1 < 4 となっており、条件を正しく満たしていることがわかります。
解決のアプローチ
この問題は、次の手順で効率的に解くことができます。
- まず、配列を昇順に並べ替えます。
- 並べ替えた配列を、小さい値を含む前半部分と、大きい値を含む後半部分の2つに分割します(要素数が奇数の場合は、前半を1つ多くします)。
- 元の配列に対して、偶数インデックスには前半部分を後ろから、奇数インデックスには後半部分を後ろから順に要素を埋めていきます。
こうすることで、比較的大きな値と小さな値が交互に配置され、自然に波状パターンが実現されます。計算量は並べ替えの O(n log n) が支配的となり、非常に効率的です。
コード例
この考え方を実装したコードは次のとおりです。
const arr = [1, 5, 1, 1, 6, 4];
const unevenSort = (arr = []) => {
arr.sort((a, b) => a - b);
let mid = Math.floor(arr.length / 2);
if(arr.length % 2 === 1){
mid += 1;
};
let even = arr.slice(0, mid);
let odd = arr.slice(mid);
for(let i = 0; i < arr.length; i++){
if(i % 2 === 0){
arr[i] = even.pop();
}else{
arr[i] = odd.pop();
};
};
};
unevenSort(arr);
console.log(arr);
出力
コンソールには次のように出力されます。
[ 1, 6, 1, 5, 1, 4 ]
-
JavaScriptで配列を空にする方法まとめ【3つの手法と使い分けのポイント】
JavaScriptで配列を空にする(初期化する)方法は複数あります。それぞれの手法には特徴や注意点があり、状況に応じて適切に使い分けることが重要です。この記事では、代表的な3つの方法と、それぞれのメリット・デメリットを詳しく解説します。まず、以下のような配列があると仮定します。let arr = [1, test, {}, 123.43];方法1:新しい空の配列で置き換えるarr = [];変数arrに新しい空の配列を再代入する方法です。最もシンプルかつ高速な手法として知られています。ただし注意点として、元の配列への参照がプログラムの他の場所に存在する場合、それらの参照は自動的に更新されませ
-
JavaScriptの基本配列メソッド解説!push・pop・shift・unshift・spliceの使い方を実例付きで紹介
JavaScriptには、配列を操作するための便利な組み込みメソッドが数多く用意されています。その中でも特によく使われるのが、要素の追加や削除を行う以下の5つの基本メソッドです。 JavaScriptの主要な配列メソッド一覧 メソッド説明 Array.push()配列の末尾に要素を追加します。 Array.pop()配列の末尾から要素を取り除きます。 Array.unshift()配列の先頭に要素を追加します。 Array.shift()配列の先頭から要素を取り除きます。 Array.splice()配列内の任意の位置で要素の追加・削除を行います。 これらのメソッドは、配列の