まずは、前回のプログラムを書いておきます。
<sample program 067-01>
#include <stdio.h>
#define COUNT 10
int main(void)
{
int data[COUNT] = { 23, 45, 9, 67, 98, 55, 32, 76, 12, 88 };
int i;
int work;
for (i = 0; i < COUNT-1; i++) {
if (data[i] > data[i + 1]) {
work = data[i];
data[i] = data[i + 1];
data[i + 1] = work;
}
}
printf("最大値は%dです。\n", data[9]);
return 0;
} |
<実行結果>
最大値は98です。 続行するには何かキーを押してください・・・
隣り合った要素同士を比較して、左側が大きい場合入れ換えることで、最大値を求めました。
では、入れ替え後の配列の中身を表示するよう改良します。
<sample program 068-01>
#include <stdio.h>
#define COUNT 10
int main(void)
{
int data[COUNT] = { 23, 45, 9, 67, 98, 55, 32, 76, 12, 88 };
int i;
int work;
for (i = 0; i < COUNT - 1; i++) {
if (data[i] > data[i + 1]) {
work = data[i];
data[i] = data[i + 1];
data[i + 1] = work;
}
}
for (i = 0; i < COUNT; i++) {
printf("data[%d] = %d\n", i, data[i]);
}
return 0;
} |
<実行結果>
data[0] = 23 data[1] = 9 data[2] = 45 data[3] = 67 data[4] = 55 data[5] = 32 data[6] = 76 data[7] = 12 data[8] = 88 data[9] = 98 続行するには何かキーを押してください・・・
前回説明したとおり、最初の配置と異なっていますね。
では、上のプログラムの
for (i = 0; i < COUNT - 1; i++) {
if (data[i] > data[i + 1]) {
work = data[i];
data[i] = data[i + 1];
data[i + 1] = work;
}
}
|
↑の部分を9回繰り返すようプログラムを変更してみてください。
要は二重ループです。
解答例です。
<sample program 068-02>
#include <stdio.h>
#define COUNT 10
int main(void)
{
int data[COUNT] = { 23, 45, 9, 67, 98, 55, 32, 76, 12, 88 };
int i;
int j;
int work;
for (j = 0; j < COUNT - 1; j++) {
for (i = 0; i < COUNT - 1; i++) {
if (data[i] > data[i + 1]) {
work = data[i];
data[i] = data[i + 1];
data[i + 1] = work;
}
}
}
for (i = 0; i < COUNT; i++) {
printf("data[%d] = %d\n", i, data[i]);
}
return 0;
} |
<実行結果>
data[0] = 9 data[1] = 12 data[2] = 23 data[3] = 32 data[4] = 45 data[5] = 55 data[6] = 67 data[7] = 76 data[8] = 88 data[9] = 98 続行するには何かキーを押してください・・・
実行結果を見ると、数値の小さい順に並んでいます。
これをソート(並べ替え)と言います。
二重ループの説明時には、外側のループにiを、内側のループにjを使っていたので、ちょっと書き換えます。
<sample program 068-02-2>
#include <stdio.h>
#define COUNT 10
int main(void)
{
int data[COUNT] = { 23, 45, 9, 67, 98, 55, 32, 76, 12, 88 };
int i;
int j;
int work;
for (i = 0; i < COUNT - 1; i++) {
for (j = 0; j < COUNT - 1; j++) {
if (data[j] > data[j + 1]) {
work = data[j];
data[j] = data[j + 1];
data[j + 1] = work;
}
}
}
for (i = 0; i < COUNT; i++) {
printf("data[%d] = %d\n", i, data[i]);
}
return 0;
} |
<実行結果>
data[0] = 9 data[1] = 12 data[2] = 23 data[3] = 32 data[4] = 45 data[5] = 55 data[6] = 67 data[7] = 76 data[8] = 88 data[9] = 98 続行するには何かキーを押してください・・・
どうして並べ替えられたのかというと、1回の実行で右端に最大値が求められましたよね。
同じプログラムをもう1度実行すると、次に大きな値が求められます。
もう1度実行すると、その次に大きな値が・・・言葉では説明しにくいので、図にします。
1回目のループ終了後の状態
2回目のループ終了後の状態
3回目のループ終了後の状態
4回目のループ終了後の状態
5回目のループ終了後の状態
6回目のループ終了後の状態
7回目のループ終了後の状態
※初期データの並び方によって変わります
8回目のループ終了後の状態
9回目のループ終了後の状態
連続して見るとこのようなイメージです。
このソート(並べ替え)の考え方を「隣接交換法」とか「バブルソート」と呼びます。
ソートの考え方は色々ありますが、比較的簡単に作成できる方法の1つです。
次回は比較的簡単な考え方で作成できる、もう1つの方法を紹介します。