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

C++で配列を並べ替える方法|選択ソートの仕組みと実装例を解説

C++では、さまざまなソート(並べ替え)アルゴリズムを使って配列を整列できます。ソート済みの配列とは、数値の大小順やアルファベット順など、何らかの基準に従って要素が並び替えられた配列のことです。代表的なソートアルゴリズムには、バブルソート、挿入ソート、選択ソート、マージソート、クイックソート、ヒープソートなどがあります。
本記事では、その中でも構造がシンプルで理解しやすい「選択ソート」を取り上げ、実際のコード例とともに詳しく解説していきます。

選択ソートとは?

選択ソートは、未ソート部分の中から最小値を繰り返し探し出し、それを未ソート部分の先頭にある要素と交換することで、配列全体を昇順に整列させていくソート手法です。

選択ソートのサンプルコード

以下は、C++で選択ソートを実装して配列を並べ替えるプログラムの例です。

#include<iostream>
using namespace std;

void selectionSort(int a[], int n) {
    int i, j, min, temp;
    for (i = 0; i < n - 1; i++) {
        min = i;
        for (j = i + 1; j < n; j++)
            if (a[j] < a[min])
                min = j;
        temp = a[i];
        a[i] = a[min];
        a[min] = temp;
    }
}

int main() {
    int a[] = { 22, 91, 35, 78, 10, 8, 75, 99, 1, 67 };
    int n = sizeof(a)/ sizeof(a[0]);
    int i;
    cout << "ソート前の配列:" << endl;
    for (i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
    selectionSort(a, n);
    cout << "\nソート後の配列:" << endl;
    for (i = 0; i < n; i++)
        cout << a[i] << " ";
    return 0;
}

実行結果

ソート前の配列:
22 91 35 78 10 8 75 99 1 67

ソート後の配列:
1 8 10 22 35 67 75 78 91 99

コードの解説

selectionSort() 関数の動作

上記プログラムでは、selectionSort() 関数が選択ソートによって配列 a[] を並べ替えています。関数内には2つのforループがあり、外側のループの各反復処理において、インデックス i 以降に残っている要素の中から最小値を探し、現在 i の位置にある要素と交換します。この操作を配列全体が整列するまで繰り返すのが、選択ソートの基本的な流れです。

void selectionSort(int a[], int n) {
    int i, j, min, temp;
    for (i = 0; i < n - 1; i++) {
        min = i;                      // 最小値の位置を仮に設定
        for (j = i + 1; j < n; j++)   // 未ソート部分を走査
            if (a[j] < a[min])
                min = j;              // より小さい値があれば位置を更新
        temp = a[i];                  // 最小値と先頭要素を交換
        a[i] = a[min];
        a[min] = temp;
    }
}

main() 関数の動作

main() 関数では、まず配列 a[] を定義し、sizeof演算子を使ってその要素数 n を求めています。続いて、配列 a[] とサイズ n を引数として selectionSort() 関数を呼び出し、並べ替えが完了した配列を画面に出力します。

int main() {
    int a[] = { 22, 91, 35, 78, 10, 8, 75, 99, 1, 67 };
    int n = sizeof(a)/ sizeof(a[0]);
    int i;
    cout << "ソート前の配列:" << endl;
    for (i = 0; i < n; i++)
        cout << a[i] << " ";
    cout << endl;
    selectionSort(a, n);
    cout << "\nソート後の配列:" << endl;
    for (i = 0; i < n; i++)
        cout << a[i] << " ";
    return 0;
}

選択ソートの計算量

選択ソートの時間計算量は、入力データの初期状態にかかわらず常に O(n²) です。これは、外側のループが n−1 回、内側のループが平均して約 n/2 回実行されるためです。一方で、要素の交換回数は最大でも n−1 回と少なく、追加のメモリをほとんど必要としないという特長があります。小規模なデータの整列には手軽で有用ですが、大量のデータを扱う場合には、O(n log n) で動作するクイックソートやマージソートなどのアルゴリズムを選ぶ方が効率的です。

  1. C++でvector(ベクトル)を並べ替える方法:std::sort()の使い方

    C++でvector(可変長配列)を並べ替えるには、標準ライブラリの std::sort() 関数を使用します。この関数は <algorithm> ヘッダーで定義されており、デフォルトでは要素を昇順(小さい順)に並べ替えます。 また、安定ソートを行いたい場合は std::stable_sort を使用します。これは sort() と同じように動作しますが、値が等しい要素同士の相対的な順序を保持する点が異なります。さらに、要件に応じてクイックソートやマージソートなどのアルゴリズムを自前で実装して利用することも可能です。なお、std::sort() の平均計算量は O(N log N

  2. C++のstd::sortを使った配列のソート方法をわかりやすく解説

    プログラミングにおいて、ソート(並べ替え)はデータを昇順または降順に整理するための基本的な処理の一つです。C++では、標準ライブラリに用意されている std::sort() 関数を使うことで、配列を簡単にソートすることができます。 std::sort() の基本的な構文は以下のとおりです。 sort(開始アドレス, 終了アドレス) 引数の説明 開始アドレス => ソート対象となる最初の要素のアドレス 終了アドレス => 配列の最後の要素の「次」の連続した位置のアドレス つまり、sort(a, a+5) と記述した場合、配列 a の先頭から5番目の要素までがソート対象となります。なお