時刻から生成した乱数を、構造体「TEST」のメンバ変数 a, b, c に代入し、
メンバb を基準にして、昇順にクイックソートしてみます。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
typedef struct{
int a;
int b;
int c;
}TEST;
int comp( const void *c1, const void *c2 );
int main(void)
{
int i;
TEST base[10];
/* 乱数の生成 */
srand( (unsigned int)time( NULL ) );
for( i=0; i<10; i++ ){
base[i].a = rand() % 100; /* 0~99の乱数 */
base[i].b = rand() % 100;
base[i].c = rand() % 100;
printf( "%d¥t", base[i].a );
printf( "%d¥t", base[i].b );
printf( "%d¥t", base[i].c );
printf( "¥n" );
}
/* TEST構造体のbを基準にソート */
printf( "¥n--TEST構造体のbを基準にソート--¥n¥n" );
qsort( base, 10, sizeof(TEST), comp );
/* ソート後のデータを表示 */
for( i=0; i<10; i++ ){
printf( "%d¥t", base[i].a );
printf( "%d¥t", base[i].b );
printf( "%d¥t", base[i].c );
printf( "¥n" );
}
return 0;
}
/* 比較関数 */
int comp( const void *c1, const void *c2 )
{
TEST test1 = *(TEST *)c1;
TEST test2 = *(TEST *)c2;
int tmp1 = test1.b; /* b を基準とする */
int tmp2 = test2.b;
return tmp1 - tmp2;
}
ランダム結果
13 22 21
63 21 45
52 45 81
75 67 94
7 1 44
81 66 38
35 24 35
62 6 4
76 12 84
86 77 71
--TEST構造体のbを基準にソート--
7 1 44
62 6 4
76 12 84
63 21 45
13 22 21
35 24 35
52 45 81
81 66 38
75 67 94
86 77 71
と、このように表示されます。
下段の真ん中の列を見ると、メンバ変数 b で並び替えられている事が分かります。
比較関数comp内では、TEST構造体でキャストしてから、bを取り出しています。
また、戻り値に「tmp1 - tmp2」を使うことで、
「a < b :負の値、a == b :0、 a > b :正の値」という条件に当てはめています。
とhttp://simd.jugem.jp/?eid=116で書かれていますが
これはb列を基準にしたソートであり、a列とc列の優先順位は書かれていません
キーの優先順位をb>a>cにするにはどうしたらよいでしょうか。
もっとたくさんキーあった時(a>b>c>d>e>f>g・・・)のようにキーの優先順位つけて昇順or降順にデータをソートしたいです。
よろしくお願いします
No.3ベストアンサー
- 回答日時:
>キーの優先順位をb>a>cにするにはどうしたらよいでしょうか。
int tmp1 = test1.b; /* b を基準とする */
int tmp2 = test2.b;
return tmp1 - tmp2;
を
int tmp1 = test1.b; /* b を基準とする */
int tmp2 = test2.b;
if (tmp1 != tmp1) return tmp1 - tmp2; /* bが不一致なら、その結果を返す */
tmp1 = test1.a; /* bが等しい場合のみ、次に a を基準とする */
tmp2 = test2.a;
if (tmp1 != tmp1) return tmp1 - tmp2; /* aが不一致なら、その結果を返す */
tmp1 = test1.c; /* bもaも等しい場合のみ、次に c を基準とする */
tmp2 = test2.c;
return tmp1 - tmp2;
に変えれば良いです。
d、e、f…と増やしたければ、同じように「優先するキーが不一致なら不一致と返し、一致した場合は次に優先するキーを比較」というのを、優先順位に合わせて繰り返しましょう。
No.2
- 回答日時:
> これはb列を基準にしたソートであり、a列とc列の優先順位は書かれていません
確かにb列を基準にしたソートになっていますが、この例ではb列だけでソートできてしまうので、a列とc列の優先順位は無関係です。b列以外の優先順位が問題になるのはb列が同じ値である場合です。
このことを踏まえれば、
> キーの優先順位をb>a>cにするにはどうしたらよいでしょうか。
比較関数でb列が一致したとき、つまりtmp1 - tmp2の値が0のとき、a列の値を比べ、それが一致しているときにc列の値を比べればよいことがわかるはずです。
キーがたくさんある場合、優先度の高いものから比較して、大小の判定がつけば、判定結果を返し、大小判定がつかないとき(値が一致しているとき)に次の優先度について判定を行う。キーの大小判定がつくまでこの操作を繰り返せばいいです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# 至急教えてください! プログラミングの問題です! お願いします! 出力2と全く同じ出力をするように、 2 2022/06/22 23:10
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
なぜ?counterintuitive
-
System.IO.Directory.GetFiles...
-
C# DataGridView のヘッダーセ...
-
VB.NETでファイル名順にファイ...
-
あるディレクトリ内のファイル...
-
C# DataTableの行をソートしてD...
-
コレクションの数値をSortで並...
-
C言語・要素除去
-
ブック.csvを開かずに他のブッ...
-
In Design
-
多次元配列のソート方法
-
コーディングの参考
-
DataGridViewソート時に先頭行...
-
LISTBOX 後から LBS_SORT を追加
-
csvファイル内にてソートす...
-
n個の要素で出来る順列組み合...
-
VB6でデータを昇順に並べ替える
-
excel VBA の条件をつけての列...
-
複数キーを利用したソートの仕...
-
EXCEL VBAのソートについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.IO.Directory.GetFiles...
-
VB.NETでファイル名順にファイ...
-
C# DataGridView のヘッダーセ...
-
なぜ?counterintuitive
-
ファイル名「1.jpg ~10.jpg~...
-
Excelですべての組合せ(重複組...
-
C# DataTableの行をソートしてD...
-
n番目に大きい数を求めるアル...
-
リスト構造のソートで悩んでま...
-
C言語・要素除去
-
10個の整数を入力して小さい順...
-
VBA基本構文の作り方 2列の...
-
あるディレクトリ内のファイル...
-
excel VBA の条件をつけての列...
-
excel VBA リストビューの行...
-
数字文字列のソート方法
-
Excel VBAで並べ替えをしたい
-
VBScriptで重複レコードを削除...
-
vbでDataTableの抽出コピー
-
構造体配列のソート
おすすめ情報