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


今回は「選択法」とか「セレクションソート」と呼ばれる方法で、並べ替えを行ってみます。

最初に考え方を説明しますので、次のアニメーションを良く見てください。


※3周目以降は割愛しています。


前回の方法と違って、比較する2つの要素が隣り合っていません。

最初の1周は0番目の値とそれ以降の値をすべて比較しています。

2周目は1番目の値とそれ以降の値を比較しています。

3周目は2番目の値とそれ以降の値、4周目は3番目の値とそれ以降を・・・

最後の9周目は8番目の値とそれ以降の値を比較します。

それぞれ、基準となる要素(1周目は0番目)の値と比較する値の大小を調べ、基準となる要素の値の方が大きい場合に入れ換えが行われます。


次は図を1枚ずつ見ていきます。


初期状態です。


まずは基準となる要素を0番目として、基準の右隣(1番目)と比較します。


基準はそのままで、比較対象を右へずらし比較します。


基準となる値の方が大きい場合、入れ換えを行います。


さらに比較対象を右にずらし比較します。







最後に9番目の要素と比較して1周目が完了です。



2周目は基準を1番目にずらし、比較は基準の右隣から開始します。










最後に9番目の要素と比較して2周目が完了です。



3週目は2番目の要素を基準として、基準の右隣から9番目まで比較します。


4週目は3番目の要素を基準として、基準の右隣から9番目まで比較します。


5週目は4番目の要素を基準として、基準の右隣から9番目まで比較します。


6週目は5番目の要素を基準として、基準の右隣から9番目まで比較します。


7週目は6番目の要素を基準として、基準の右隣から9番目まで比較します。


8週目は7番目の要素を基準として、基準の右隣から9番目まで比較します。


9週目は8番目の要素を基準として、基準の右隣から9番目まで比較します。

この時点で一番大きな数が右端(9番目)に入っていますので、これで終わりです。


今回のソートのポイントは以下の通りです。

周目 基準 比較対象
1周目 0番目 1〜9番目
2周目 1番目 2〜9番目
3周目 2番目 3〜9番目
4周目 3番目 4〜9番目
5周目 4番目 5〜9番目
6周目 5番目 6〜9番目
7周目 6番目 7〜9番目
8周目 7番目 8〜9番目
9周目 8番目 9番目

1.基準は0から1ずつ増えています。

2.比較対象は基準+1から9まで変化します。

3.基準の方が大きければ入れ換えを行います。


ポイント1と2は二重ループで作成できそうです。

では、↓のプログラムを元に作成してみましょう。


<sample program 069-00>

#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; 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
続行するには何かキーを押してください・・・









































解答例です。


<sample program 069-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 j;

    int work;

    for (i = 0; i < COUNT - 1; i++) {
        for (j = i + 1; j < COUNT; j++) {
            if (data[i] > data[j]) {
                work = data[i];
                data[i] = data[j];
                data[j] = 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
続行するには何かキーを押してください・・・

基準は0から8まで変化しますので、

for (i=0; i<COUNT-1; i++) {

}

↑のループで実現できます。


基準が1増える間に比較対象は基準+1から9まで変化しますから、

for (i=0; i<COUNT-1; i++) {
    for (j=i+1; j<COUNT; j++) {

    }
}

内側に基準+1から始まるループを入れれば完成です。


前回に引き続きソートのプログラムを作成しましたが、他にもソートの実現方法は沢山あります。

比較的考え方が簡単な2種類のソートを紹介しましたが、色々調べて他の方法も試してください。

ちなみに小さい順に並べ替えることを昇順ソート、大きい順だと降順ソートと言います。


次へ

戻る

目次へ