|
ただ気になる点が一つ。quick()で軸をchar *xに持たせていますが、多分
配列の中央または中央より一つ前寄りを選択するので大丈夫だとは思うの
ですが、クイック・ソートのアルゴリズムではこれがソート中に置き換わ
ってしまうとまずいのです。
それを修正した版です。前のプログラムでおかしくなる例があるかどうか
探してみてください。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define swap(type, x, y) do { type t = x; x = y; y = t; } while (0)
typedef struct{
char kigou[10];
int number;
char english[30];
} Genso;
void quick(Genso a[], int left, int right)
{
int pl = left;
int pr = right;
char tmp[10];
strcpy(tmp, a[(pl + pr) / 2].kigou);
do {
while (strcmp(a[pl].kigou, tmp) < 0) pl++;
while (strcmp(a[pr].kigou, tmp) > 0) pr--;
if (pl <= pr) {
swap(Genso, a[pl], a[pr]);
pl++;
pr--;
}
} while (pl <= pr);
if (left < pr) quick(a, left, pr);
if (pl < right) quick(a, pl, right);
}
int main(void)
{
char str[256];
FILE *infp;
FILE *outfp;
int i = 0;
Genso data[105];
int youso;
infp = fopen("genso1.txt", "r");
if (infp == NULL) {
printf("Can not open file \n"); exit(1);
}
outfp = fopen("genso2.txt", "w");
if (outfp == NULL) {
printf("Can not open file \n"); exit(1);
}
while (fgets(str, sizeof(str), infp) != NULL) {
sscanf(str, "%s %d %s", data[i].kigou, &data[i].number, data[i].english);
i++;
}
youso = i;
fclose(infp);
quick(data, 0, youso - 1);
for (i = 0; i < youso; i++)
fprintf(outfp, "%s %d %s\n" , data[i].kigou, data[i].number, data[i].english);
fclose (outfp);
return 0;
}
|