まずは、前回のプログラムを書いておきます。
<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つの方法を紹介します。