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

JavaScriptで実装する特殊なソートアルゴリズム ― 偶数は昇順・奇数は降順に並べ替える

問題の概要

整数の配列を唯一の引数として受け取るJavaScript関数を作成します。この関数は、次の条件に従って配列を並べ替える必要があります。

  • すべての偶数昇順(小さい順)に並べる

  • すべての奇数降順(大きい順)に並べる

  • 偶数と奇数の相対的な位置関係は元のまま維持する

入力例

たとえば、入力配列が次のような場合を考えます。

const arr = [12, 17, 15, 24, 1, 6];

このとき、期待される出力は以下のとおりです。

const output = [6, 17, 15, 12, 1, 24];

偶数(12, 24, 6)を昇順に並べると「6, 12, 24」、奇数(17, 15, 1)を降順に並べると「17, 15, 1」になります。これらの値が、それぞれ元の配列で偶数・奇数が占めていた位置へそのまま収まるため、位置関係も崩れません。

実装例

以下が実際のコードです。

const arr = [12, 17, 15, 24, 1, 6];
const specialSort = (nums = []) => {
   const oddArr = [], evenArr = [];
   for (let i = 0; i < nums.length; i++){
      if (nums[i] & 1) {
         oddArr.push(i);
      } else {
         evenArr.push(i);
      }
   }
   nums.sort((a, b) => a - b);
   let odd = oddArr.length - 1, even = 0;
   const res = [];
   for (let i = 0; i < nums.length; i++){
      if (nums[i] & 1) {
         res[oddArr[odd--]] = nums[i];
      } else {
         res[evenArr[even++]] = nums[i];
      }
   }
   return res;
}

アルゴリズムの解説

この実装のポイントは、値そのものではなく「偶数・奇数がどのインデックスに存在するか」を先に記録しておく点にあります。処理の流れは以下のとおりです。

  1. 最初のループで配列を走査し、奇数があるインデックスを oddArr へ、偶数があるインデックスを evenArr へそれぞれ格納します。

  2. 次に、元の配列全体を sort() を使って昇順に並べ替えます。計算量は O(n log n) です。

  3. ソート済みの配列を先頭から順に確認しながら結果配列 res を組み立てます。値が偶数なら evenArr の位置に左から順に、奇数なら oddArr の位置に右から順に書き込みます。

この「偶数は前詰め・奇数は後ろ詰め」という配置方法により、最小の偶数から順に左側へ、最大の奇数から順に左側へと自然に配置されていき、「偶数は昇順・奇数は降順」という条件を満たす配列が完成します。

出力結果

コンソールには次のように出力されます。

[ 6, 17, 15, 12, 1, 24 ]
  1. JavaScriptの型キャスト(型変換)とは?String・Number・Booleanの使い方を解説

    型キャスト(型変換)とは?型キャストとは、あるデータ型を別のデータ型へ明示的に変換することを指します。JavaScriptでは、以下の3つの関数を使った変換が最も一般的です。String() … 文字列型へ変換Boolean() … 真偽値型へ変換Number() … 数値型へ変換それぞれの関数に値を渡すだけで、簡単に目的の型へ変換できるのが特徴です。JavaScriptで型キャストを行うコード例以下は、JavaScriptで型キャストを行うサンプルコードです。ボタンをクリックすると、値「44」が文字列・数値・真偽値へそれぞれ変換され、結果が画面に表示されます。<!DOCTYPE htm

  2. JavaScriptの型強制(Type Coercion)とは?仕組みを初心者向けにわかりやすく解説

    型強制(Type Coercion)とは、あるデータ型が自動的・暗黙的に別のデータ型へと変換される仕組みのことです。JavaScriptは動的型付け言語であり、開発者が明示的に型を指定しなくても、状況に応じて値の型が自動的に変換されます。特に注意が必要なのが「+」演算子です。片方が文字列の場合、数値は文字列に変換されて文字列の連結として処理されます。一方、「-」「*」「/」などの算術演算子では、文字列は数値へ変換されるため、挙動の違いを理解しておくことが重要です。以下に、JavaScriptにおける型強制の動作を確認できるサンプルコードを示します。サンプルコード<!DOCTYPE htm