整列 ―選択ソート―
選択ソートとは
バブルソートと同様に,次の整数値の配列データを昇順に並べ替えます.
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 してみると,バブルソートと比較して,それほどの違いがないように思えます.
ところが,一般的に選択ソートの方が演算回数が少なく,処理速度が上がります.