C++選択ソートの動作原理

一、アルゴリズムの基本手順

  1. 初期化:配列を整列済み領域(空)と未整列領域(全要素)に分割
  2. 最小値検出:未整列領域内で最小値の位置を探索
  3. 交換処理:検出された最小値と未整列領域の先頭要素を交換
  4. 範囲更新:整列済み領域を1要素拡大、未整列領域を1要素縮小
  5. 繰り返し:未整列領域が1要素になるまで手順2~4を実行

二、C++実装例

#include <iostream>
using namespace std;

void sortSelection(int array[], int length) {
    for (int boundary = 0; boundary < length - 1; boundary++) {
        int candidate = boundary;
        for (int probe = boundary + 1; probe < length; probe++) {
            if (array[probe] < array[candidate]) {
                candidate = probe;
            }
        }
        swap(array[boundary], array[candidate]);
    }
}

int main() {
    int array[] = {5, 3, 1, 4, 2};
    int length = sizeof(array) / sizeof(array[0]);
    sortSelection(array, length);
    cout << "Sorted array: ";
    for (int i = 0; i < length; i++) {
        cout << array[i] << " ";
    }
    return 0;
}

コードのポイント:

コード 説明
for (int boundary = 0; boundary < length - 1; boundary++) 整列済み領域の終端を管理し、各反復で1要素追加
int candidate = boundary 未整列領域の先頭を仮の最小値として初期化
probe = boundary + 1 整列済み領域を無視し、未整列領域のみを探索
swap(array[boundary], array[candidate]) 最小要素を未整列領域の先頭と交換し、整列を1段階進める

三、性能分析

特性 説明
**時間計算量** O(n²)(データの順序に関わらず全要素を比較)
**空間計算量** O(1)(追加メモリを必要としないインプレース処理)
**安定性** 不安定(同一値の要素の相対位置が変化する可能性あり)
**最適な利用ケース** 小規模データ処理 / 交換回数を最小限に抑えたい場合

四、動作の可視化

初期状態:|5  3  1  4  2
1回目:   1 |3  5  4  2
2回目:   1  2 |5  4  3
3回目:   1  2  3 |4  5
4回目:   1  2  3  4 |5

五、改善方向

  1. 最大最小同時探索:1回の走査で最小値と最大値を同時に検出
  2. 再帰実装:残りの未整列領域を再帰的に処理
  3. 並列化対応:整列状態をチェックし、不要な処理を省略

タグ: C++ 選択ソート O(n²) インプレースソート 不安定ソート

7月7日 22:43 投稿