qsortと動的確保の2次元配列
C言語で以下のようなソートのあるプログラムを作ろうとしているのですが、良い方法が思いつきません。。。。
どなたか,知恵を貸していただけないでしょうか?
・複数人の身長と体重がcsvファイルに2列に入っている。
人 身長 体重
1 158.9 50.5
2 161.2 72.3
3 150.4 42.8
4 170.7 80.4
5 165.0 59.9
・ ・
・ ・
・ ・
・↑このように身長も体重もランダムに並んでいる状態
・身長・体重をプログラムで読み込んだら 身長の低い順にソートする。この時体重も身長に対応して並び換わってほしい。
(わかりやすいかと思い人の番号列を設けましたが、人の番号は考えなくて良いです)
この問題に対して,データ数が不特定かつ多いため
動的確保の2次元配列を使ったクイックソートで対応を考えます。
qsortについてあれこれ調べていたのですが,動的確保でのqsort例が無く困っています。。。
どなたかちょっとアドバイスをいただけないでしょうか?
よろしくお願いします。
#include <stdio.h>
#include <stdlib.h>
enum {HIGHT, WEIGHT, COLUMN};
int comp (const void *a, const void *b) //比較関数
{
return (int) (((double *)a)[HIGHT] - ((double *)b)[HIGHT]) ;
}
int main(void)
{
//////////////////////////////////////////////////////////
私情により、ソート以前の処理で使用するため
あらかじめ .csv ファイルから fget で値を読み込んで コンマで分割しx[]y[]に格納してある。
&データ数をカウントしている
今は省略
仮定として以下のように5つのデータ数を読み込んでいたとする
double x[5] = {158.9,161.2,150.4,170.7,165.0};
double y[5] = {50.5,72.30,42.8,80.4,59.9};
int n=5; //データカウント数
///////////////////////////////////////////////////////////
int i;
double **list;
list = (double**)malloc(sizeof(double)*5);
for (i=0 ; i< 5 ; i++)
{
list[i] = (double*)malloc(sizeof(double)*COLUMN);
if (list[i]==NULL) return 1;/* 領域確保に失敗したか */
}
for(i=0;i<n;i++)
{
list[i][HIGHT]=x[i];
list[i][WEIGHT]=y[i];
}
for(i = 0; i < n; i ++) printf("%lf %lf\n", list[i][HIGHT], list[i][WEIGHT]);
puts("Sort");
qsort(list,n, sizeof(double [COLUMN]), comp);
for(i = 0; i <n; i ++) printf("%lf %lf\n", list[i][HIGHT], list[i][WEIGHT]);
scanf("%d",i);
return 0;
}
お礼
初歩的なミスをしていました。ありがとうございます。