★データ構造(配列8)★


まずは、前回のプログラムを書いておきます。


<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つの方法を紹介します。


次へ

戻る

目次へ