サイトマップ / 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言語講座−それ自体コンパイルできる教材を使った講座です−