現在、C言語を用いて構造体の配列のソーティングプログラムを実装しています。
以下のようにqsortを用いて実装していたものを、挟み込み法でソートする自作関数に作り変えたいと思っています。
qsortで使用した比較関数はそのまま使用するつもりです。
main
1if(strcmp(argv[1],"credit")==0){/*argv[1]で指定されたメンバでソートする*/ 2 qsort(grade_data,n,sizeof(SRec),comp_credit); 3 }else if(strcmp(argv[1],"gpa")==0){ 4 qsort(grade_data,n,sizeof(SRec),comp_gpa); 5 }else if(strcmp(argv[1],"name")==0){ 6 qsort(grade_data,n,sizeof(SRec),comp_name); 7 }else{ 8 printf("ソートしたいフィールドをcredit/gpa/nameの中から正しく選択してください。\n"); 9 }
※grade_dataは構造体の配列のポインタ、nは要素数です。(これ以前のコードでファイル入力関数でを実装しており、その引数として受け取っている)
としていたものを
main
1void gpa_sort(SRec *grade_data,int n, int (*comp_gpa)(const void*,const void*));/*自作ソート関数:ソート対象の構造体へのポインタ、要素数、voidへのポインタを引数に取る比較関数へのポインタ*/ 2void credit_sort(SRec *grade_data,int n, int (*comp_credit)(const void*,const void*)); 3void name_sort(SRec *grade_data,int n,int (*comp_name)(const void*,const void*)); 4 5if(strcmp(argv[1],"credit")==0){/*argv[1]で指定されたメンバでソートする*/ 6 credit_sort(grade_data,n,comp_credit); 7 }else if(strcmp(argv[1],"gpa")==0){ 8 gpa_sort(grade_data,n,comp_gpa); 9 }else if(strcmp(argv[1],"name")==0){ 10 name_sort(grade_data,n,comp_name); 11 }else{ 12 printf("ソートしたいフィールドをcredit/gpa/nameの中から正しく選択してください。\n"); 13 }
のように書き換えてソートを実装したいのですが、それぞれのソート関数をどのように書けばよいのか全く見当がつかないので、ご教授いただけるとありがたいです。
また、比較関数は以下の通りです。
int comp_credit(const void *arg1,const void *arg2){ int x = ((SRec*)arg1)->credit; int y = ((SRec*)arg2)->credit; if ( x < y ) return -1; if ( y < x ) return 1; return 0; } int comp_gpa(const void *arg1,const void *arg2){ float x = ((SRec*)arg1)->gpa; float y = ((SRec*)arg2)->gpa; if ( x < y ) return -1; if ( y < x ) return 1; return 0; } int comp_name(const void *arg1,const void *arg2){ const char* x = ((SRec*)arg1)->name; const char* y = ((SRec*)arg2)->name; return strcmp(x,y); }
配列の挟み込み法を用いたソートプログラムは以下です。
void sort_func( int number[], int n ) { int k,m,x,y; for( k=1; k<n; ++k ) { x = number[k]; if( number[k-1] <= x )continue; for( m=0; m<k; ++m ) { if( number[m] >= x )break; /*mを見つけたらループ抜ける*/ } for( y=k; y>m; --y ) /*要素をずらしていく*/ { number[y] = number[y-1]; } number[m] = x; } printf("ソートを完了しました。\n"); }
考えているのは、
・比較関数での戻り値によって条件分岐し、それによって構造体の配列を挟み込み法でソートする
←比較関数の戻り値の受け取り方が分からない
という感じです。
よろしくおねがいします。
回答4件
あなたの回答
tips
プレビュー