サイトマップ / C言語講座出入り口総目次目次:ポインタ>単純選択ソート

青い直線

単純選択ソート

青い直線

[変数の値を交換]←このソース→[部分文字列の検索]

/* ソートとは

ソート(sort)とは、データをある規則に従って並び替えることをいいます。例えば、辞書の項目はソートされています。数字を小さいものから順に(昇順)並べ替えること、大きいものから順に(降順)並べ替えること等がこれに当たります。

ソートには、プログラムを組むのは簡単だが速度の遅いもの、少し複雑だが高速なもの等、色々なアルゴリズムが案出され使われてきました。ソートの詳細はソートで学びます。

単純選択ソートのアルゴリズム

今日は数あるソートのアルゴリズムのうち、単純選択ソートによる文字列データのソートについて学びます。

単純選択ソートとは、最も小さい要素を探し、それと先頭の要素と交換します。これで、1番目の要素が確定しました。次いで2番目の要素について同じことを行い、2番目に小さい要素と入れ替えます。これを続けていくと、順次小さいものから確定していきます。比較する要素がなくなれば、ソートが終了します。

void StrSort( )がその関数です。ソートの途中経過を表示するなどして、すこし複雑なので、その骨組みを下記に示します。要素数nの配列をソートするとします。

    for (i = 0; i < n - 1; i++) {
        for (j = i + 1; j < n; j++) {
            i 番目の要素よりj番目の要素が小さければ、入れ替える。
        }
    }

2重のforループになっています。外側のforループで、交換の対象となる要素を指定します。内側のforループで、それ以降の要素と大小の比較を行っています。

iの初期値は0で、iが0の時、jは1から n - 1 の値をとります。なお、要素数nの配列の末尾の要素の添字はn - 1です。配列の先頭の要素と残りの全ての要素が比較される訳です。内側のループから抜けた時点で、str[0]に最も小さい要素が入ります。iの値が1になると、jは2からn-1の値をとります。内側のループから抜けた時、2番目の要素に2番目に小さい値がはいります。分かりやすいアルゴリズムだと思います。

今回は、文字列の大小の比較なので、strcmp( )を使います。

今回のソートはポインタの指す文字列の比較を行っているだけで、文字列のメモリ上の位置は変わりません。ポインタの入れ替えを行っているだけです。 */

/* ここからソースプログラム */

#include <stdio.h>
#include <string.h>       /* strcmp(  )に必要  */

#define NUM_DATA  10      /* ソートするデータ数  */

  /* ソート対象の文字列へのポインタの配列 */
char *animal[NUM_DATA] = {"Cat", "Dog", "Tiger", "Bug", "Bird",
                          "Fish", "Seep", "Cow", "Pig", "Rat"
                         };

void StrSort(char *str[ ], int n);
void main(void);

  /* n個の文字列をソート */
void StrSort(char *str[ ], int n)
{
    int i, j, k;
    char *temp;            /* 作業用ポインタ */
	
    for (i = 0; i < n - 1; i++) {
        for (j = i + 1; j < n; j++) {
            if ((strcmp(str[j], str[i])) < 0) {
                temp = str[i];                /* 作業用ポインタを使い */
                str[i] = str[j];              /* i + 1番目に小さい要素と */
                str[j] = temp;                /* str[i] の要素と交換 */
            }
        }
        for (k = 0; k < n; k++)            /* ソートの途中経過を表示 */
            printf("%s  ", str[k]);
        printf("\n");
    }
}

void main(void)
{
	int i;
	
	printf("ソート前: ");

          /* ソートの対象を表示 */
	for (i = 0;  i < NUM_DATA; i++)
		printf("%s  ", animal[i]);

	printf("\n\n");
	printf("ソート開始\n\n");

	StrSort(animal, NUM_DATA);	/* animalは配列の先頭アドレス */

	printf("\nソート後: ");		/* ソート結果を表示 */
	for (i = 0; i < NUM_DATA; i++)
		printf("%s  ", animal[i]);

	printf("\n");
}

/* ここまでソースプログラム */

/* ソースプログラムをコンパイルして実行してみると、ソーティングの途中経過が表示されます。よく見ると、最初の要素が最初に確定され、次いで2番目、3番目というように、配列の添字の小さいものから順に確定していくのがわかります。

このソートのアルゴリズムでは、実行に要する時間はデータの並び方の影響を受けません。データの個数が決まれば、実行時間が決まります。

ここまで主としてchar型のポインタを例に学んで来ました。他のデータ型のポインタ、メンバに構造体へのポインタを含む構造体など、まだ学んでいない様々な形のポインタがあります。それらについては、今後の学習の過程で、随時、学んでいきます。 */

[変数の値を交換]←このソース→[部分文字列の検索]

青い直線

/* (C) 2000- YFプロ. All Rights Reserved. */    提供:C言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:ポインタ>単純選択ソート