基本的な整列を4つ扱いました.この他に,クイックソートやマージソートなどの所謂高速ソートがありますが,C言語の学び直しとしては話しを次に進めていきたいと思います.
ここまで整数値の整列をしましたので,文字列の整列を扱います.アルゴリズムとしては,整数値の場合と何ら変わりありません.比較の場面などでチョットした違いがありますので,バブルソートでその部分を確認しましょう.

C言語の文字列の扱い

C言語では,文字を char 型の変数に格納します.ただし,1つの変数に1つの文字のみを格納し,文字列を格納するためには char 型の配列変数を利用します.例えば,文字列 sort を格納しようすれば

str[0] str[1] str[2] str[3] str[4]
s o r t \0

のようになります.

それでは,文字列の配列はどうなるかと言えば,2次元の配列を用いることになります.ということは・・・文字列の整列って相当面倒臭いの?となります.そこで登場するのが,ポインタです.出たぜ!ポインタ! これがあるからC言語って厄介なんだよな! と考えてしまうところですが,モノは考えようで「ポインタがあるから色々できる」と言えます.

何はともあれ,文字列をバブルソートするプログラムを示しましょう.

Cording

文字列 Japan, USA, Germany, France, England を昇順に並べるプログラムです.

#include <stdio.h>
#include <string.h> 
int main(void) {
    char *a[5] = {"Japan", "USA", "Germany", "France", "England"};
    char *b;        /* 変数の入れ替えをする退避用の変数 */
    int len = 5;    /* 整列する文字列の数 */
    for (int i = 0; i < len - 1; i++) {
        for (int j = 0; j < len - i; j++) {
            if (strcmp(a[j], a[j + 1]) > 0) {
                b = a[j];
                a[j] = a[j - 1];
                a[j - 1] = b;
            }
        }
  }
  for (int i = 0; i < len; i++) {
        printf("%s  ", a[i]);
    }
    printf("\n");
    return 0;
}

#include <string.h> 

後述する関数 strcmp(str1, str2) を利用するためにヘッダファイル string.h をインクルードします.

char *a[5] =  {"Japan", "USA", "Germany", "France", "England"};

例えば,配列 a[] に対して変数 a は,a[0] のアドレスを示します.
  char *a[5] = ・・・
により a[0] ~ a[4] のアドレスを先頭とする配列に "Japan", "USA", "Germany", "France", "England" を格納する処理をしています.と同時に,a[0] にあたかも "Japan" の文字列が格納されているように扱えます.この部分が重要です.

strcmp(str1, str2)

2つの文字列 str1 と str2 を比較して
  str1 == str2 ならば 0 を
  str1 と str2 が昇順に並んでいれば正の値を
  str1 と str2 が降順に並んでいれば負の値を
それぞれ戻り値として返します.
したがって,降順に並べ替えたい場合は
  if (strcmp(a[j] , a[j + 1]) < 0) {・・・
とします.

b = a[j]; a[j] = a[j + 1]; a[j + 1] = b;

整数値の整列と同じですが,もうお分かりになるよう,変数の内容ではなくアドレスを入れ替えています.が,プログラマになるのでなければ,気にする必要ないですよね.

printf("%s ", a[i]);

文字列を出力する場合には "%s" を指定します.

Last modified: Tuesday, 29 August 2023, 6:31 PM