人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

C言語の二次元配列のソートについて教えてください。


以下の配列があります。配列に入っている数値を基に降順にソートしたいと思います。ただし、ソート結果から2次元配列の添え字がわかる必要があります。どのようにすればよろしいでしょうか?

また、降順ソート後、数値の大きい配列から選択します。選択された配列の添え字は次の選択には利用できません。例を挙げると以下はソート例の一部です。最初にD[1][3]を選択します。次にD[2][3]を選択肢にしますが、すでに添え字の3は利用されているので選択不可とします。次のD[1][1]は添え字1が使われていますので同様に不可です。D[2][2]の添え字ははじめての選択になるため2番目の選択となります。これも同様に添え字が最終的にわかる必要があります。

D[1][3]=10;
D[2][3]=8;
D[1][1]=7;
D[2][2]=6;



配列の例
D[0][0]=0;
D[0][1]=3;
D[0][2]4;
D[0][3]=1;
D[1][0]=2;
D[1][1]=7;
D[1][2]3;
D[1][3]=10;
D[2][0]=2;
D[2][1]=5;
D[2][2]=6;
D[2][3]=8;

以上2つの質問ですが、どちらか一方の回答のみでも結構です。よろしくお願いします。


●質問者: mai_mai_mail
●カテゴリ:コンピュータ インターネット
✍キーワード:2次元 にわか ソート 二次元 言語
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● zzz_1980
●100ポイント ベストアンサー
#include <stdio.h>
#include <stdlib.h>

 typedef struct DATA {
 int d,x,y;
 } DATA;
int compare(DATA *,DATA *);

int compare(DATA *n,DATA *m)
{
 return(n->d<m->d?1:-1);
}

int main(int argc,char *argv[])
{
 int i,j,D[3][4],flags[4];
 DATA data[12];
 D[0][0]=0; D[0][1]=3; D[0][2]=4; D[0][3]=1;
 D[1][0]=2; D[1][1]=7; D[1][2]=3; D[1][3]=10;
 D[2][0]=2; D[2][1]=5; D[2][2]=6; D[2][3]=8;
 for(i=0;i<3;i++){
 for(j=0;j<4;j++){
 data[i*4+j].d=D[i][j];
 data[i*4+j].x=i; data[i*4+j].y=j;
 }
 }
 for(j=0;j<4;j++){
 flags[j]=0;
 }
 qsort(data,12,sizeof(DATA),compare);
 for(i=0;i<12;i++){
 if((flags[data[i].x]==0)&&(flags[data[i].y]==0)){
 printf("d[%d][%d]=%d\n",data[i].x,data[i].y,data[i].d);
 flags[data[i].x]=1; flags[data[i].y]=1;
 }
 }
}


実行結果

% ./xx
d[1][3]=10
d[2][2]=6
d[0][0]=0
%
◎質問者からの返答

早速の回答ありがとうございます。VS2005 VC コンソールアプリでComplieしてみました。

以下のエラーとなります。構造体 DATAにVoidはつかられませんし、エラーを回避する方法はございますでしょうか。ご教授ください。

エラー1error C2664: 'qsort' : 4 番目の引数を 'int (__cdecl *)(DATA *,DATA *)' から 'int (__cdecl *)(const void *,const void *)' に変換できません。(新しい機能 ; ヘルプを参照)

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ