ソートの検証法
Posted: 2010年11月06日(土) 21:52
最近クイックソートについて質問させていただいたみけCATです。
そのほかにもいろいろなソートのプログラムを作ってみています。
すべて昇順にソートするプログラムです。
そこでそのソートのプログラムが間違っていないか検証したいです。
しかし、今使っている検証プログラムではうまく検証できているか不安です。
このプログラムは、以下の3点を検証します。
・配列の前の値が今の値より大きくないか
・配列の値を全て足したものがソート前と同じか
・配列の値を全てxorしたものがソート前と同じか
このプログラムで間違っている、あっている、
またその他いい方法があるという意見がある方は言ってくれれば嬉しいです。
また、自分がだめだと思うのは以下の方法です。
・ソート前とソート後の配列のハッシュ値をとる
ソートによって配列のデータが変わるので、意味ないと思います。
・ソート前の配列を別にソートし、ソートの結果と比較する
そのソートがあっているかわからないし、そのソートの時間がもったいないと思います。
よろしくお願いします。
そのほかにもいろいろなソートのプログラムを作ってみています。
すべて昇順にソートするプログラムです。
そこでそのソートのプログラムが間違っていないか検証したいです。
しかし、今使っている検証プログラムではうまく検証できているか不安です。
このプログラムは、以下の3点を検証します。
・配列の前の値が今の値より大きくないか
・配列の値を全て足したものがソート前と同じか
・配列の値を全てxorしたものがソート前と同じか
このプログラムで間違っている、あっている、
またその他いい方法があるという意見がある方は言ってくれれば嬉しいです。
/*苦Cより*/ int GetRandom(int min,int max) { return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX)); } int makedata(int** data,int datanum) { int i; *data=malloc(datanum*sizeof(int)); for(i=0;i<datanum;i++)(*data)=GetRandom(0,INT_MAX)*((rand()%2)*2-1); } void sortcheck(char* sortname,int datanum,void (*sortfunc)(int*,int)) { static int doornot=0; int* data; unsigned int starttime; unsigned int keikatime; int i; int ok; int sum; int xor; int sumafter; int xorafter; if(doornot!=2) { printf("%sをしますか?\n",sortname); printf("0:はい 1:いいえ 2:すべて\n>"); scanf("%d",&doornot); } else { printf("%sをします。\n",sortname); } if(doornot!=1) { makedata(&data,datanum); sum=0; xor=0; for(i=0;i<datanum;i++) { sum+=data; xor^=data; } starttime=GetTickCount(); sortfunc(data,datanum); keikatime=GetTickCount()-starttime; ok=1; for(i=1;i<datanum;i++) { if(data<data[i-1]) { ok=0; break; } } if(ok) { sumafter=0; xorafter=0; for(i=0;i<datanum;i++) { sumafter+=data; xorafter^=data; } if(sum!=sumafter || xor!=xorafter)ok=0; } if(ok)printf("ソート成功"); else printf("ソート失敗"); printf(" %uミリ秒\n",keikatime); free(data); } }
また、自分がだめだと思うのは以下の方法です。
・ソート前とソート後の配列のハッシュ値をとる
ソートによって配列のデータが変わるので、意味ないと思います。
・ソート前の配列を別にソートし、ソートの結果と比較する
そのソートがあっているかわからないし、そのソートの時間がもったいないと思います。
よろしくお願いします。