JavaScriptで0と1のバイナリ配列を並べ替える方法
0と1だけが含まれる数値の配列があるとしましょう。この配列を受け取り、すべての1を先頭に、0を末尾に移動させる関数をJavaScriptで実装する必要があります。
例えば、入力配列が次の場合 −
const arr = [1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1];
期待される出力は次のようになります −
const output = [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0];
コード例
以下がその実装コードです −
const arr = [1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1];
const sortBinary = arr => {
const copy = [];
for(let i = 0; i < arr.length; i++){
if(arr[i] === 0){
copy.push(0);
}else{
copy.unshift(1);
}
}
return copy;
};
console.log(sortBinary(arr));
出力
コンソールには以下のように表示されます −
[ 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 ]
コードの解説
この関数の仕組みはシンプルです。
- まず、結果を格納するための空の配列
copyを用意します。 - 元の配列を先頭から順番に走査し、要素が
0であればpush()メソッドで配列の末尾に追加します。 - 要素が
1であればunshift()メソッドで配列の先頭に挿入します。 - これにより、走査が完了した時点で、1はすべて先頭側に、0はすべて末尾側に集まった状態になります。
注意点:パフォーマンスについて
unshift() は配列の先頭に要素を挿入するため、既存の全要素を後方にずらす処理が発生します。そのため、この実装の計算量は最悪の場合 O(n²) となり、大規模な配列ではパフォーマンスが低下する可能性があります。
より効率的にしたい場合は、1の個数を数えてから新しい配列を組み立てる次のような方法も有効です −
const sortBinaryFast = arr => {
const onesCount = arr.reduce((sum, num) => sum + num, 0);
return Array.from({ length: arr.length }, (_, i) => (i < onesCount ? 1 : 0));
};
console.log(sortBinaryFast([1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 1]));
// [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
こちらのアプローチは配列を一度走査するだけで済むため、計算量は O(n) となり、大きなデータセットでも安定したパフォーマンスを発揮します。
-
JavaScriptのArray.values()メソッドの使い方をわかりやすく解説
Array.values()メソッドとはJavaScriptのArray.prototype.values()メソッドは、配列の各インデックスに格納された値を順番に取り出せる、新しいArray Iterator(配列イテレータ)オブジェクトを返します。引数は不要で、呼び出すだけでイテレータを取得できます。返されたイテレータに対してnext()メソッドを呼び出すと、{value: 値, done: 真偽値}という形式のオブジェクトが1つずつ返され、配列の要素を先頭から順に処理することができます。構文arr.values()パラメータと戻り値パラメータ:なし戻り値:配列の各インデックスの値を含む、
-
JavaScriptのArray.values()メソッドとは?使い方とサンプルコードを徹底解説
JavaScriptのArray.values()メソッドとは? JavaScriptのArray.values()メソッドは、対象の配列に含まれるすべての値を格納したイテレーターオブジェクトを返します。ES2015(ES6)以降で利用可能なこのメソッドは、for...ofループやスプレッド構文([...arr])と組み合わせることで、配列の各要素を効率的に取り出せます。 なお、keys()やentries()がインデックス情報も一緒に返すのに対し、values()は純粋に「値」だけを順番に提供する点が大きな特徴です。 基本構文 arr.values() 引数は不要で、戻り値として新しいArr