奇偶転置
ソート(Odd-Even Sort)は、
ソートアルゴリズムの一種で、バブル
ソートを改良したものです。バブル
ソートが一方向にスキャンを行うのに対し、奇偶転置
ソートではデータの組ごとに比較・交換を行います。この特性から、並列処理が可能な点が特徴です。
奇偶転置
ソートは、以下の手順で要素を
ソートします。
1.
組1の処理: まず、
奇数番目の要素とその次の
偶数番目の要素をペアにして比較し、必要であれば交換します。例えば、1番目と2番目、3番目と4番目、というようにペアを作ります。
2.
組2の処理: 次に、
偶数番目の要素とその次の
奇数番目の要素をペアにして比較し、必要であれば交換します。例えば、2番目と3番目、4番目と5番目、というようにペアを作ります。
3.
繰り返し: 上記の組1と組2の処理を、
ソートが完了するまで繰り返します。
この処理を繰り返すことで、最終的にデータが
ソートされます。
実装例
以下は、
C言語における実装例です。
c
void oddEvenSort(int arr[], int n) {
bool isSorted = false;
while (!isSorted) {
isSorted = true;
//
奇数インデックスのペアを処理
for (int i = 1; i <= n - 2; i += 2) {
if (arr[i] > arr[i+1]) {
swap(arr[i], arr[i+1]);
isSorted = false;
}
}
//
偶数インデックスのペアを処理
for (int i = 0; i <= n - 2; i += 2) {
if (arr[i] > arr[i+1]) {
swap(arr[i], arr[i+1]);
isSorted = false;
}
}
}
}
上記の例では、
配列`arr`を
ソートします。`isSorted`フラグを用いて、
ソートが完了したかをチェックしています。
動作例
以下に、具体的なデータの並び替え例を示します。
初期データ: 8, 4, 3, 7, 6, 5, 2, 1
1.
1回目の処理 (組1)
- (8, 4) を比較し交換 → 4, 8, 3, 7, 6, 5, 2, 1
- (3, 7) はそのまま → 4, 8, 3, 7, 6, 5, 2, 1
- (6, 5) を比較し交換 → 4, 8, 3, 7, 5, 6, 2, 1
- (2, 1) を比較し交換 → 4, 8, 3, 7, 5, 6, 1, 2
2.
1回目の処理 (組2)
- (8, 3) を比較し交換 → 4, 3, 8, 7, 5, 6, 1, 2
- (7, 5) を比較し交換 → 4, 3, 8, 5, 7, 6, 1, 2
- (6, 1) を比較し交換 → 4, 3, 8, 5, 7, 1, 6, 2
3.
2回目の処理 (組1)
- (4, 3) を比較し交換 → 3, 4, 8, 5, 7, 1, 6, 2
- (8, 5) を比較し交換 → 3, 4, 5, 8, 7, 1, 6, 2
- (7, 1) を比較し交換 → 3, 4, 5, 8, 1, 7, 6, 2
- (6, 2) を比較し交換 → 3, 4, 5, 8, 1, 7, 2, 6
この処理を繰り返すことで、最終的に
ソートが完了します。
計算量
奇偶転置
ソートは、最悪の場合でも時間計算量がO(n^2)であり、バブル
ソートと同じです。ただし、組の比較が互いに独立しているため、並列処理が可能です。
並列処理
ハードウェアで隣接する組の比較を同時に処理すれば、常に(n-1)ステップで処理が完了します。しかし、
ソート対象のデータが多いと必要となるリソースが大きくなり、実用的ではない場合もあります。
特徴
- - 安定性: バブルソートと同様に安定なソートです。
- - 並列性: 並列処理が可能で、ハードウェア実装に適しています。
- - 計算量: 最悪計算量はO(n^2)です。
- - リソース: データ量が多いと、リソースを多く消費します。
奇偶転置
ソートは、特定の状況下で有効な
ソートアルゴリズムと言えるでしょう。
参考