- ベストアンサー
C言語でのソート方法を解説|部署と年齢で優先順位をつける方法
- C言語でのソート方法を解説します。配列の一列目が性別、二列目が年齢、三列目が部署の情報を持つshainData配列を、部署と年齢の優先順位で並べ替えたい場合のプログラムの修正方法を解説します。
- 現在のプログラムでは、部署と年齢の並び替えが独立に行われてしまうため、正しい並び替えが行われていません。プログラムを修正して、部署が昇順で、年齢が降順で並べ替える方法を解説します。
- 修正したプログラムは、バブルソートのアルゴリズムを使用しています。まず、部署の並び替えを行い、その後に年齢の並び替えを行います。最終的に、並び替えられたデータが表示されます。修正したプログラムを詳しく解説します。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
#include <stdio.h> void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b = temp; } int main(void) { int i, j, start, end; int shainData[][3]={{0,20,1},{1,34,1},{0,55,1},{1,43,3},{1,21,3},{0,43,3},{0,21,2},{1,67,3},{0,83,3},{0,24,2},{1,56,3},{0,78,3},{0,44,1},{1,33,1},{0,22,2},{1,66,3},{0,55,1},{1,31,1},{0,41,3},{0,43,3}}; for (j = 19; j > 0; j--) { for (i = 0; i < j; i++) { if (shainData[i][2] > shainData[i+1][2]) { swap(&shainData[i][0], &shainData[i+1][0]); swap(&shainData[i][1], &shainData[i+1][1]); swap(&shainData[i][2], &shainData[i+1][2]); } } } start = 0; while (start < 20) { end = start; while (end < 20 && shainData[start][2] == shainData[end][2]) { end++; } for (j = end-1; j > start; j--) { for (i = start; i < j; i++) { if (shainData[i][1] < shainData[i+1][1]) { swap(&shainData[i][0], &shainData[i+1][0]); swap(&shainData[i][1], &shainData[i+1][1]); swap(&shainData[i][2], &shainData[i+1][2]); } } } start = end; } for (i = 0; i < 20; i++) { printf("%d %d %d\n",shainData[i][0], shainData[i][1], shainData[i][2]); } return 0; }
その他の回答 (5)
- Tacosan
- ベストアンサー率23% (3656/15482)
それにしても, qsort 嫌いなのかなぁ?
- Tacosan
- ベストアンサー率23% (3656/15482)
はい, このままではおかしな結果になるはずです>#3. より正確には「優先順位を取り違えてソートした結果」になるはずです (cf. 基数ソート). と思ってよく見てみたらそもそも「部署は昇順、年齢は降順」にならないなぁ. あと余談だけど main は int を返すようにすべき.
- ninoue
- ベストアンサー率52% (1288/2437)
後一つ、最初のループで部署についてソート済みですよね。 それを次のループで部署には無関係に年齢でソートしてしまうとおかしな答になってしまいませんか。 部署が同じデータの間で年齢についてソートする必要がありそうです。 ゛ 先ず同じ部署のデータが幾つ続くかを確認する。 2個以上ある場合はそれらのデータの間で年齢についてソートする。 .... といった形になると思われます。 頑張ってください。
- ninoue
- ベストアンサー率52% (1288/2437)
Tacosanさんの回答で問題点は指摘されているので、注意して検討されたら分るはずですが。 . 或いは途中経過をプリントして確認してください。 shainData[i] は性別、年齢、部署のペアで意味を持っていますよね。 それを年齢だけ入れ替えたりすると変なデータになってしまうのではないでしょうか。 例えば 男、35、設計 と 女、21、経理 の年齢で入れ替える必要があった時、あなたのやり方では 男、21、設計 と 女、35、経理 のペアの変な人が出来てしまうのではないでしょうか。 年齢を入れ替える時には、性別、部署のデータも同時に入れ替えて下さい。
- Tacosan
- ベストアンサー率23% (3656/15482)
例えば if(shainData[i][2]<shainData[i+1][2]){ Temp=shainData[i][2]; shainData[i][2]=shainData[i+1][2]; shainData[i+1][2]=Temp; } の部分, 3列目だけを入れ替えてるよね. 1列目や 2列目は移動させなくていいんですか? 「部署、年齢の優先順位で並べ替えたい」はどっちを優先させたいのかよくわからん.
補足
説明不足で申し訳ございません。優先順位は部署>年齢です。 この問題は一列目は関係ないので必要ありません。 また二列目の移動はどうすればよろしいでしょうか?
お礼
ありがとうございます。