• 締切済み

二次配列のqsortですが

Cの初心者ですがよろしくおねがいします。 二次配列をqsortでソートしたいのですがまだソートする前の順番も記憶したいのですがどうすればいいのでしょうか 分かる方にはぜひ教えていただきたいのです! 例えばcount[j][i]をqsortでソートし、昇順で並べ変えた後のiの元の順番に対して今の順番も記憶する場合でお願いします.

みんなの回答

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

2次元配列がメモリマップ上で1次元配列に見えるならば、そのままqsortが使えます。 そうでなくて、なんらかの順序関係あるいは、ベクトルの1次元配列のような別のデータ構造をもっているものであるなら、それに対応してプログラムも変わってきます。 まずは問題の定義にもっと明確にしてみては。 あるいは具体的に2×2や3×2といった少ない要素で入力例と出力例を補足すれば、回答が得られやすいと思います。 >前の順番も記憶したい 順番を別配列に記憶させておくか、てっとりばやくソート前の配列をmemcpyして記憶しておくとか。

mars2608
質問者

補足

osamuyさん レスありがとうございます. 一段落のプログラムを載らせていただきました.count3[j][i]をバブルソートで降順でやってみましたが高速が要求されるため,qsortを使ってやり直したいのですが ちなみにcount1[j][i],count2[j][i]は前で定義してあります.count4[j][i]にはiの順番を記憶するための二次配列です よろしくおねがいします. int ind_near_search(int j,int t) { int i,var_num,count3[IND][VAR],count4[IND][VAR],temp1,temp2,num=0,m=0; for(i=0;i<VAR;i++){ if(individual[j].x[i]==1){ //変数が1と0の場合分け count2[j][i]=t-count[j][i]; }else{ count2[j][i]=count[j][i]; } if(individual[j].x[i]==1){ //全てcount3に値を入れる count3[j][i]=count2[j][i]; }else{ count3[j][i]=count[j][i]; } } for(i=0;i<VAR;i++){ count4[j][i]=num++; } for(m=0;m<VAR-1;m++){ for(i=0;i<VAR;i++){ //バブルソートにより降順に並べ換え if(count3[j][i]<count3[j][i+1]){ temp1=count3[j][i]; count3[j][i]=count3[j][i+1]; count3[j][i+1]=temp1; temp2=count4[j][i]; //count4にはcount3の並べ替え後の対応する番号を入れる count4[j][i]=count4[j][i+1]; count4[j][i+1]=temp2; } } } for(i=0;i<VAR;i++){ var_num=count4[j][i]; //count4の大きい順番からその番号をvar_numに渡す if(individual[j].x[var_num]==0){//0と1の場合分け individual[j].x[var_num]=1; }else{ individual[j].x[var_num]=0; }

関連するQ&A