Skip to content

Instantly share code, notes, and snippets.

@todorok1
Created August 25, 2019 06:23
Show Gist options
  • Save todorok1/44eff87c915c92ae8095765df3fd285a to your computer and use it in GitHub Desktop.
Save todorok1/44eff87c915c92ae8095765df3fd285a to your computer and use it in GitHub Desktop.
奇偶転置ソートアルゴリズムのC#による実装例。
using UnityEngine;
/// <Summary>
/// バブルソートを改良した奇偶転置ソートを行うスクリプトです。
/// </Summary>
public class OddEvenSort : SortBase {
void Start(){
ExecuteSort();
}
void ExecuteSort(){
// ソートしたい配列を定義します。
int[] targetArray = new int[11]{26, 400, 19, 504, 8, 500, 58, 14, 401, 168, 13};
// コンソールに配列の中身を表示します。
InspectArrayContents(targetArray);
// 処理回数を保持する変数です。
int iterationNum = 0;
// 外側のループが何回実行されたかを保持する変数です。
int loopNum = 0;
// 奇偶転置ソートで配列の中身を昇順で並べ替えます。
while (true){
// 処理回数を表示します。
Debug.Log($"{loopNum + 1}週目の処理");
// 交換が発生したか確認するフラグを用意します。
bool isChanged = false;
// 開始インデックスが偶数の要素から後ろに向かってペアを作り比較を行います。
for (int i = 0; i < targetArray.Length - 1; i += 2){
// 処理回数の値を増やします。
iterationNum++;
// 隣り合う要素と比較し、順序が逆であれば入れ替えます。
if (targetArray[i] > targetArray[i + 1]){
// 配列の要素の交換を行います。
int temp = targetArray[i + 1];
targetArray[i + 1] = targetArray[i];
targetArray[i] = temp;
// 交換を行なったのでフラグをtrueにセットします。
isChanged = true;
}
}
// コンソールに配列の中身を表示します。
InspectArrayContents(targetArray);
// 開始インデックスが奇数の要素から後ろに向かってペアを作り比較を行います。
for (int i = 1; i < targetArray.Length - 1; i += 2){
// 処理回数の値を増やします。
iterationNum++;
// 隣り合う要素と比較し、順序が逆であれば入れ替えます。
if (targetArray[i] > targetArray[i + 1]){
// 配列の要素の交換を行います。
int temp = targetArray[i + 1];
targetArray[i + 1] = targetArray[i];
targetArray[i] = temp;
// 交換を行なったのでフラグをtrueにセットします。
isChanged = true;
}
}
// コンソールに配列の中身を表示します。
InspectArrayContents(targetArray);
// 交換が発生しなければwhileループを抜けます。
if (!isChanged){
break;
}
// ループ回数のカウントを増やします。
loopNum++;
}
// コンソールに配列の中身を表示します。
Debug.Log("*** 最終結果 ***");
InspectArrayContents(targetArray);
Debug.Log($"処理回数は {iterationNum} 回でした。");
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment