#6
by かずま » 6年前
lily さんが書きました:やっと出来ました・・
出来たプログラムをぜひ貼り付けてください。
lily さんが書きました:
boxさん、答えになるプログラムを書いていただき本当にありがとうございました。
box さん。なぜ、挿入ソートを選択ソートに
変更したのか教えていただけませんか?
元のプログラムのソートには何も問題はありません。
問題点を整理すると、次の 2点でした。
・文字列 zip の比較を strcmp ではなく、< 演算子で行っていた。
・配列の要素全体を交換せず、メンバの zip の先頭文字だけを交換していた。
表示は、ソートの中で行わず、呼び出し元で行うほうが良いでしょう。
コード:
#include <stdio.h>
#if 1
typedef struct {
char *zip, *first, *last;
} Employees;
#else
typedef struct {
char zip[6], first[12], last[12];
} Employees;
#endif
Employees workers[] = {
{ "31415", "George", "Washington" },
{ "14142", "Abraham", "Lincoln" },
{ "27182", "William", "Clinton" },
{ "22360", "Barack", "Obama" },
{ "16180", "Donald", "Trump" },
};
void sortzip(Employees workers[], int size)
{
int i, j;
for (i = 1; i < size; i++) {
Employees t = workers[i];
for (j = i-1; j >= 0 && strcmp(t.zip, workers[j].zip) < 0; j--)
workers[j+1] = workers[j];
workers[j+1] = t;
}
}
int main(void)
{
int i, n = sizeof(workers) / sizeof(workers[0]);
sortzip(workers, n);
for (i = 0; i < n; i++)
printf("%s %s %s\n", workers[i].zip, workers[i].first, workers[i].last);
}
#if 0 を #if 1 に変更することもできますが、
配列の要素のサイズが大きくなって効率が少し下がります。
[quote="lily" id=3,19966,149777]やっと出来ました・・[/quote]
出来たプログラムをぜひ貼り付けてください。
[quote="lily" id=3,19966,149777]
boxさん、答えになるプログラムを書いていただき本当にありがとうございました。[/quote]
box さん。なぜ、挿入ソートを選択ソートに
変更したのか教えていただけませんか?
元のプログラムのソートには何も問題はありません。
問題点を整理すると、次の 2点でした。
・文字列 zip の比較を strcmp ではなく、< 演算子で行っていた。
・配列の要素全体を交換せず、メンバの zip の先頭文字だけを交換していた。
表示は、ソートの中で行わず、呼び出し元で行うほうが良いでしょう。
[code=c]
#include <stdio.h>
#if 1
typedef struct {
char *zip, *first, *last;
} Employees;
#else
typedef struct {
char zip[6], first[12], last[12];
} Employees;
#endif
Employees workers[] = {
{ "31415", "George", "Washington" },
{ "14142", "Abraham", "Lincoln" },
{ "27182", "William", "Clinton" },
{ "22360", "Barack", "Obama" },
{ "16180", "Donald", "Trump" },
};
void sortzip(Employees workers[], int size)
{
int i, j;
for (i = 1; i < size; i++) {
Employees t = workers[i];
for (j = i-1; j >= 0 && strcmp(t.zip, workers[j].zip) < 0; j--)
workers[j+1] = workers[j];
workers[j+1] = t;
}
}
int main(void)
{
int i, n = sizeof(workers) / sizeof(workers[0]);
sortzip(workers, n);
for (i = 0; i < n; i++)
printf("%s %s %s\n", workers[i].zip, workers[i].first, workers[i].last);
}
[/code]
#if 0 を #if 1 に変更することもできますが、
配列の要素のサイズが大きくなって効率が少し下がります。