選択ソートとは

バブルソートと同様に,次の整数値の配列データを昇順に並べ替えます.

a[0] a[1] a[2] a[3] a[4]
32 12 24 8 17

バブルソートが,隣り合うデータを比較し入れ替えを行うことによって,データ中の最小値を左端に持ってくるのに対して,選択ソートでは,最小値を見つけ出して左端に持ってきます.
したがって,ある範囲のデータから最小値を見つけることができれば,それを繰り返してデータ全体を昇順に並べ替えることができます.

そこで,配列 a[0] ~ a[4] から最小値を見つける手順を考えましょう.

1 整数型変数 min を宣言し,配列中の最小値であるデータを格納する配列番号を代入するものとします.
最初に,a[0] の 32 が最小であると仮定して,min = 0 とします.

32 12 24 8 17

2 a[min]a[1] を比較します.

32 12 24 8 17

a[1] の 12 の方が小さいので,min の値を min = 1 とします.

3 次に,a[min]a[2] を比較します.

32 12 24 8 17

a[min] の方が小さいので,min の値は min = 1 のままにします.

4 続いて,a[min]a[3] を比較します.

32 12 24 8 17

a[3] の 8 の方が小さいので,min の値を min = 3 とします.

5 さらに,a[min]a[4] を比較します.

32 12 24 8 17

a[min] の方が小さいので,min の値は min = 3 のままにします.
これで,a[3] が最小の整数値であることが分かりました.

6 a[0] と a[min] が等しくなければ,2つの数値を入れ替えます.

8 12 24 32 17

以上で,a[0] ~ a[4] の最小値を左端に持ってくることができました.

8 12 24 32 17

以下,バブルソートと同様に,残りのデータについて上の処理を繰り返します.

Cording

整数値データを10個与えて,昇順に並べるプログラムを作ります.

#include <stdio.h>
void main() {
    int a[] = {100, 53, 19, 8, 81, 37, 16, 25, 44, 22};
    int len = sizeof(a) / sizeof(int);
    int min;
    for (int i = 0; i < len - 1; i++) {
        min = i;
        for (int j = i + 1; j < len; j++) {
            if (a[min] > a[j]) {
                min = j;
            }
        }
        if (min != i) {
            int b = a[i];
            a[i] = a[min];
            a[min] = b;
        }
  }
  for (int i = 0; i < len; i++) {
        printf("%d, ", a[i]);
    }
    printf("\n");
    return 0;
}

coding してみると,バブルソートと比較して,それほどの違いがないように思えます.
ところが,一般的に選択ソートの方が演算回数が少なく,処理速度が上がります.

Last modified: Sunday, 13 August 2023, 12:49 PM