|
[ 簡単な説明 ] ソート関数の使用例です。 ソート結果の、昇順、降順どちらかをオプション指定できます。 出力例は、 test1 1 1 400 として実行したものです。(クイックソートで int 型データ 400個のソーティングを実行) 本テストプログラムは、10種類の各ソート関数を選択できるように作成されています。(第1引数) また、PC9801 で実行したベンチマーク例を示します。 int 型データのソートには、クイックソートより、逆写像ソートや分布数えソートが優れています。 double 型データのソートにも、分布数えソートが優れています。 つまり、数値のデータで数値の分布する範囲があらかじめ判っていれば、分布数えソートが最適です。 文字列型のソートは、クイックソートが最も優れています。 |
/* test1.c sort subroutine test */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "sort.h"
#define LEN 7
long _idum_u0;
void usage(uchar *s);
double urnd0(void);
void usage(uchar *s)
{
fprintf(stderr, "Usage : %s type case n < print-flag >\n", s);
fprintf(stderr, " type = 1 : quick sort\n");
fprintf(stderr, " = 2 : bubble sort\n");
fprintf(stderr, " = 3 : insert sort\n");
fprintf(stderr, " = 4 : selection sort\n");
fprintf(stderr, " = 5 : merge sort\n");
fprintf(stderr, " = 6 : heap sort\n");
fprintf(stderr, " = 7 : inverse mapping sort\n");
fprintf(stderr, " = 8 : distribution counting sort\n");
fprintf(stderr, " = 9 : indirect quick sort\n");
fprintf(stderr, " =10 : indirect distribution counting sort\n");
fprintf(stderr, " case = 1 : for int data\n");
fprintf(stderr, " = 2 : for double data\n");
fprintf(stderr, " = 3 : for character string data\n");
fprintf(stderr, " n : number of data\n");
fprintf(stderr, " print-flag : if print, any character input.\n");
exit(0);
}
main(int argc, char *argv[])
{
int *ai, *alasti, *pi, *qi, *tmpi, *tlasti, *jun, *jlast;
double *ad, *alastd, *pd, *qd, *tmpd, *tlastd;
uchar **ac, **alastc, **pc, **qc, **tmpc, **tlastc, *b, *c;
int i, j, pflag, n, n1, type, data;
long stime, ttime;
if(argc < 4) usage(argv[0]);
type = atoi(argv[1]);
data = atoi(argv[2]);
n = atoi(argv[3]);
if(n <= 1 || type < 1 || type > 10 || data < 1 || data > 3 ||
(data == 2 && (type == 7 || type == 10)) ||
(data == 3 && (type == 7 || type == 8 || type == 10)))
{
fprintf(stderr, "Error : illegal data input.\n");
if(n <= 1) fprintf(stderr, " n=%d (must be n > 1)\n", n);
else
fprintf(stderr, " type=%d case=%d not exist.\n", type, data);
exit(-1);
}
ai = (int *)malloc(sizeof(int) * n);
ad = (double *)malloc(sizeof(double) * n);
ac = salloc(n, LEN);
tmpi = (int *)malloc(sizeof(int) * n);
tmpd = (double *)malloc(sizeof(double) * n);
tmpc = salloc(n, LEN);
jun = (int *)malloc(sizeof(int) * n);
if( ai == NULL || ad == NULL || ac == NULL ||
tmpi == NULL || tmpd == NULL || tmpc == NULL || jun == NULL)
{
fprintf(stderr, "Error : out of memory\n");
exit(-2);
}
pflag = (argc > 4);
alasti = ai + n - 1;
alastd = ad + n - 1;
alastc = ac + n - 1;
tlasti = tmpi + n - 1;
tlastd = tmpd + n - 1;
tlastc = tmpc + n - 1;
jlast = jun + n - 1;
_idum_u0 = 987612345L;
pi = tmpi;
while(pi <= tlasti) *pi++ = 65 + (int)(urnd0() * 26.);
pd = tmpd;
while(pd <= tlastd) *pd++ = urnd0();
pc = tmpc;
while(pc <= tlastc)
{
c = *pc + LEN;
*c-- = '\0';
while(c >= *pc) *c-- = 65 + (int)(urnd0() * 26.);
pc++;
}
ttime = 0;
if(type < 9)
{
switch(data)
{
case 1:
pi = ai;
qi = tmpi;
while(pi <= alasti) *pi++ = *qi++;
break;
case 2:
pd = ad;
qd = tmpd;
while(pd <= alastd) *pd++ = *qd++;
break;
case 3:
pc = ac;
qc = tmpc;
while(pc <= alastc)
{
for(b = *qc, c = *pc, j = 0; j <= LEN; j++) *c++ = *b++;
pc++;
qc++;
}
break;
}
}
if(pflag)
{
fprintf(stderr, "*** data print out ***\n\n");
switch(data)
{
case 1:
pi = ai;
do{ printf("%c", *pi++); } while(pi <= alasti);
break;
case 2:
pd = ad;
do{ printf("%7.4f ", *pd++); } while(pd <= alastd);
break;
case 3:
pc = ac;
do{ printf("%7s ", *pc++); } while(pc <= alastc);
break;
}
putchar('\n');
}
switch(type)
{
printf("\n");
case 1:
printf("*** quick sort ***\n");
stime = clock();
switch(data)
{
case 1: qsort_i(ai, n); break;
case 2: qsort_d(ad, n); break;
case 3: qsort_c(ac, n); break;
}
ttime = (clock() - stime);
break;
case 2:
printf("*** bubble sort ***\n");
stime = clock();
switch(data)
{
case 1: bsort_i(ai, n); break;
case 2: bsort_d(ad, n); break;
case 3: bsort_c(ac, n); break;
}
ttime = (clock() - stime);
break;
case 3:
printf("*** insert sort ***\n");
stime = clock();
switch(data)
{
case 1: inssort_i(ai, n); break;
case 2: inssort_d(ad, n); break;
case 3: inssort_c(ac, n); break;
}
ttime = (clock() - stime);
break;
case 4:
printf("*** selection sort ***\n");
stime = clock();
switch(data)
{
case 1: ssort_i(ai, n); break;
case 2: ssort_d(ad, n); break;
case 3: ssort_c(ac, n); break;
}
ttime = (clock() - stime);
break;
case 5:
printf("*** merge sort ***\n");
stime = clock();
switch(data)
{
case 1: msort_i(ai, n); break;
case 2: msort_d(ad, n); break;
case 3: msort_c(ac, n, LEN); break;
}
ttime = (clock() - stime);
break;
case 6:
printf("*** heap sort ***\n");
stime = clock();
switch(data)
{
case 1: hsort_i(ai, n); break;
case 2: hsort_d(ad, n); break;
case 3: hsort_c(ac, n); break;
}
ttime = (clock() - stime);
break;
case 7:
printf("*** inverse mapping sort ***\n");
stime = clock();
if(data == 1) mapsort(ai, n, 255, 0);
ttime = (clock() - stime);
break;
case 8:
printf("*** distribution counting sort ***\n");
stime = clock();
switch(data)
{
case 1: distsort_i(ai, n, 255, 0); break;
case 2: distsort_d(ad, n, 1., 0.); break;
}
ttime = (clock() - stime);
break;
case 9:
printf("*** indirect quick sort ***\n");
stime = clock();
switch(data)
{
case 1: iqsort_i(tmpi, n, jun); break;
case 2: iqsort_d(tmpd, n, jun); break;
case 3: iqsort_c(tmpc, n, jun); break;
}
ttime = (clock() - stime);
break;
case 10:
printf("*** indirect distribution counting sort ***\n");
stime = clock();
if(data == 1) idistsort(tmpi, n, 255, 0, jun);
ttime = (clock() - stime);
break;
}
if(pflag)
{
if(type < 9)
{
switch(data)
{
case 1:
pi = ai;
do{ printf("%c", *pi++); } while(pi <= alasti);
break;
case 2:
pd = ad;
do{ printf("%7.4f ", *pd++); } while(pd <= alastd);
break;
case 3:
pc = ac;
do{ printf("%7s ", *pc++); } while(pc <= alastc);
break;
}
}
else
{
pi = jun;
switch(data)
{
case 1:
do{ printf("%c", *(tmpi + *pi)); } while(++pi <= jlast);
break;
case 2:
do{ printf("%7.4f ", *(tmpd + *pi)); } while(++pi <= jlast);
break;
case 3:
do{ printf("%7s ", *(tmpc + *pi)); } while(++pi <= jlast);
break;
}
}
putchar('\n');
}
if(pflag && type < 9)
{
printf("\n*** inverse test ***\n");
switch(data)
{
case 1:
inv_i(ai, n);
pi = ai;
do{ printf("%c", *pi); } while(++pi <= alasti);
break;
case 2:
inv_d(ad, n);
pd = ad;
do{ printf("%7.4f ", *pd); } while(++pd <= alastd);
break;
case 3:
inv_c(ac, n);
pc = ac;
do{ printf("%7s ", *pc); } while(++pc <= alastc);
break;
}
putchar('\n');
}
printf("time : %ld [sec]\n\n", ttime);
return 1;
}
double urnd0(void)
{
double d = 1. / 4294967296.;
return (double)(_idum_u0 *= 69069L) * d + 0.5;
}
|
RALNVMCJBMCZJNHGKAPEKJDMJIAGYHKVYXXKYVADEBLJSEYXUMXDIMBATTKXNVWVKHZFNCUNGJOLRGDT URSLPYFGSUGPIBQELDDXDYBCOCXNUPUZXNZHJACOQBIXRHMVTITZNFHZQZUMBXOIBZJMCBDVGJKAAVYI KZYMXTUWJVHUQDZDKFLHPLNMNNXQICNUTEQZRLSYXLGLBEIIMGORYPGPUMEBSNIXKAPSPHXCTULZEATH CIWBPAFTTDHDRRLXJTKKUIDRRWJOCSECJRJMGHZCHMFHBCTNXRKIOQYPUSJWIKJHSQVNZBBITRRLZLVE QCWKRLRIOKODQGVZXOWICARTQUGEVLETLMSZDWOARDYGDMZYBWWOIYXFXCGPKXCTPGUCFHMFFDGMDLBJ *** quick sort *** AAAAAAAAAAAAABBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDDDDEEEEEEEEEEEE FFFFFFFFFFGGGGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHIIIIIIIIIIIIIIIIIIIJJJJJJJJJJJJJJJJJK KKKKKKKKKKKKKKKKLLLLLLLLLLLLLLLLLLMMMMMMMMMMMMMMMMMMNNNNNNNNNNNNNNNOOOOOOOOOOOOP PPPPPPPPPPPPQQQQQQQQQQQRRRRRRRRRRRRRRRRRRSSSSSSSSSSTTTTTTTTTTTTTTTTTUUUUUUUUUUUU UUUUVVVVVVVVVVVVVWWWWWWWWWWXXXXXXXXXXXXXXXXXXXXXYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZ *** inverse test *** ZZZZZZZZZZZZZZZZZZYYYYYYYYYYYYYYXXXXXXXXXXXXXXXXXXXXXWWWWWWWWWWVVVVVVVVVVVVVUUUU UUUUUUUUUUUUTTTTTTTTTTTTTTTTTSSSSSSSSSSRRRRRRRRRRRRRRRRRRQQQQQQQQQQQPPPPPPPPPPPP POOOOOOOOOOOONNNNNNNNNNNNNNNMMMMMMMMMMMMMMMMMMLLLLLLLLLLLLLLLLLLKKKKKKKKKKKKKKKK KJJJJJJJJJJJJJJJJJIIIIIIIIIIIIIIIIIIIHHHHHHHHHHHHHHHHGGGGGGGGGGGGGGGGGFFFFFFFFFF EEEEEEEEEEEEDDDDDDDDDDDDDDDDDDDCCCCCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBBBAAAAAAAAAAAAA time : 0 [sec] |
| algorithm | n | [sec] | ratio |
| quick sort | 20000 | 0.8563 | 1.000 |
| bubble sort | 2000 | 7.8812 | 0.0109 |
| insert sort | 2000 | 3.2500 | 0.0263 |
| selection sort | 2000 | 4.5750 | 0.0187 |
| merge sort | 20000 | 1.5750 | 0.544 |
| heap sort | 20000 | 2.1781 | 0.393 |
| inverse mapping sort | 20000 | 0.2344 | 3.653 |
| distribution counting sort | 20000 | 0.2719 | 3.149 |
| indirect quick sort | 20000 | 1.3000 | 0.659 |
| indirect distribution counting sort | 20000 | 0.2781 | 3.079 |
| algorithm | n | [sec] | ratio |
| quick sort | 20000 | 4.6281 | 1.000 |
| bubble sort | 2000 | 25.4000 | 0.0182 |
| insert sort | 2000 | 17.9219 | 0.0258 |
| selection sort | 2000 | 19.9563 | 0.0232 |
| merge sort | 20000 | 6.3281 | 0.731 |
| heap sort | 20000 | 6.6312 | 0.698 |
| distribution counting sort | 20000 | 1.7344 | 2.668 |
| indirect quick sort | 20000 | 5.8125 | 0.796 |
| algorithm | n | [sec] | ratio |
| quick sort | 20000 | 5.8844 | 1.000 |
| bubble sort | 2000 | 30.5531 | 0.0193 |
| insert sort | 2000 | 9.8844 | 0.0595 |
| selection sort | 2000 | 16.5125 | 0.0356 |
| merge sort | 20000 | 10.3031 | 0.571 |
| heap sort | 20000 | 8.5563 | 0.688 |
| indirect quick sort | 20000 | 7.1594 | 0.822 |