整列 ―バブルソート―
ここから暫く整列を扱います.
まずは,数値を小さい順や大きい順にに並べることを考えましょう.
このページでは,整列アルゴリズムの中で最も基本的な バブルソート を用いて,int型の配列データを並べ替えるプログラムを作成します.
バブルソートとは
配列 a[0]~a[4] に次のような整数型データが入っているとします.
a[0] | a[1] | a[2] | a[3] | a[4] |
32 | 12 | 24 | 8 | 17 |
このデータを a[0] から昇順に並べ替えます.
並べ替えの手順は,データ行の右側から2つずつのデータを比べて,右側のデータが左側のデータより小さければ2つのデータを並べ替えていきます.
1 この場合は,最初に a[3] の 8 と a[4] の 17 を比較します.
32 | 12 | 24 | 8 | 17 |
8 の方が小さいので,そのままにします.
したがって,データの並び方は変わりません.
2 次に,a[2] の 24 と a[3] の 8 を比較します.
32 | 12 | 24 | 8 | 17 |
右側の 8 の方が小さいので,a[2] と a[3] の値を入れ替えます.
32 | 12 | 8 | 24 | 17 |
3 続けて,a[1] の 12 と a[2] の 8 を比較します.
32 | 12 | 8 | 24 | 17 |
右側の 8 の方が小さいので,a[1] と a[2] の値を入れ替えます.
32 | 8 | 12 | 24 | 17 |
4 さらに,a[0] の 32 と a[1] の 8 を比較します.
32 | 8 | 12 | 24 | 17 |
右側の 8 の方が小さいので,a[0] と a[1] の値を入れ替えます.
8 | 32 | 12 | 24 | 17 |
以上の操作で,データ中の最小値である 8 が a[0] に納まりました.
8 | 32 | 12 | 24 | 17 |
残りのデータについて,同じ操作を繰り返せばデータを昇順に並べ替えることができます.
逆に,2つのデータ比べて大き方のデータを左に移していけば,データを降順に並べ替えることができます.
このソート手順は,データが昇順または降順に浮かび上がってくるように見えることから,泡に例えてバブルソートと呼ばれます.
Cording
整数値データを10個与えて,昇順に並べるプログラムを作ります.
#include <stdio.h>
int main(void) {
int a[] = {100, 53, 19, 8, 81, 37, 16, 25, 44, 22};
int len = sizeof(a) / sizeof(int);
for (int i = 0; i < len - 1; i++) {
for (int j = len - 1; j > i; j--) {
if (a[j - 1] > a[j]) {
int b = a[j];
a[j] = a[j - 1];
a[j - 1] = b;
}
}
}
for (int i = 0; i < len; i++) {
printf("%d, ", a[i]);
}
printf("\n");
return 0;
}
コマンドについては,特に問題になることはありませんが,細かなところで2点確認をしておきます.
1つ目は,配列へのデータへの格納です.
見てのとおり
a[] = {100, 53, 19, 8, 81, 37, 16, 25, 44, 22}
と { } で囲ってまとめて入力することができます.
もう一つは,配列のデータ数を得る方法です.
演算子 sizeof() を使います.
これは,変数や型のメモリサイズを得るものです.
ここではデータ数が10となっていますが,実際に使うときのデータ数は,そのときそのときで変わりますので,データ数を得る手段を用意しておく必要があります.
sizeof(a) で配列 a[] のメモリサイズを取得します
sizeof(int) で int型変数のメモリサイズを取得します
sizeof(a) は,あくまでもメモリサイズでありデータの個数ではありません.
変数型のメモリサイズで割ることにより,データの個数を取得することができます.