ページ 11

qsortのdouble型

Posted: 2012年6月15日(金) 15:23
by yellow
#include<stdio.h>
#define N 10
#include<stdlib.h>


double_comp(const void*a,const void*b){
return(*(double*)a-*(double*)b);
}




int main(void)
{
double a[N];
int i;

for(i=0;i<N;i++){
a=1.0/(0.1*rand()+1);
}
qsort(a,N,sizeof(double),double_comp);

for(i=0;i<N;i++){
printf("%.12f\n",a);
}

return(0);
}

乱数でデータを発生させて、qsort関数を用いて小さい順に並べ直すプログラムを作成したいのですが、うまくソートされません。
比較関数の書き方を教えていただけると助かります。

Re: qsortのdouble型

Posted: 2012年6月15日(金) 16:08
by みけCAT
コードはcodeタグで囲んでいただけるとありがたいです。

qsortの比較関数は、一般的にオーバーフローの危険があるため、引き算はよくないとされています。
特に今回はdouble型なので、値が違っても引き算すると絶対値が1未満になり、
切り捨てで0になる(=同じ値とみなされてしまう)可能性が高いです。


どのくらいの速度が必要なのかわかりませんが、私は普通こんな感じで書きます。

コード:

int double_comp(const void* x,const void* y) {
	const double* a=(const double*)x;
	const double* b=(const double*)y;
	if(*a>*b)return 1;
	if(*a<*b)return -1;
	return 0;
}

Re: qsortのdouble型

Posted: 2012年6月15日(金) 16:13
by Blue
qsortの比較関数の戻り値はintですので、

>>return(*(double*)a-*(double*)b);

だと、intにキャストされ、1未満の値が全て落ちちゃって判定がうまくいっていないんでしょう。
具体的な記述はみけCATさんが記述してくださっていますのでそちらを参照してください。

あと、この例だと毎回同じ値になってしまうので、srand関数を使ったほうがよいですね。
(実際はそうしているかもしれないけど)