// Comparison of sorting techniques to produce suffix array // Uses less space that lab2.2.c for radixsort #include #include #include #include #include double CPUtime() { struct rusage rusage; getrusage(RUSAGE_SELF,&rusage); return rusage.ru_utime.tv_sec+rusage.ru_utime.tv_usec/1000000.0 + rusage.ru_stime.tv_sec+rusage.ru_stime.tv_usec/1000000.0; } void shellsort(char **a,int N) { int group; int i,j,h,hWork; char *v; for (h=1; (hWork=3*h+1)0;h/=3) { for (group=0; group=h && a[j-h]>v) while (j>=h && strcmp(a[j-h],v)>0) { a[j]=a[j-h]; j -= h; } a[j]=v; } } } int pstrcmp(const void* p, const void* q) { return strcmp(*((char**) p), *((char**) q)); } #define MAXN 10000000 char c[MAXN], *a[MAXN]; int n=0; int msd1[500000]; // Input to start of radix pass int msd2[500000],pos2[500000]; // From LSD subpass int msd3[500000],pos3[500000]; // from MSD subpass int count[500000]; #define lsd1(j) ((j)>=n-i ? 0 : msd1[(j)+i]) #define lsd2(j) (lsd1(pos2[j])) #define lsd3(j) (lsd1(pos3[j])) void radixsort(char **a,int n) { int i,j,k,lastMSD,lastLSD; int radix=257; if (n>radix) radix=n; for (i=0;i=0;j--) { count[lsd1(j)]--; msd2[count[lsd1(j)]]=msd1[j]; pos2[count[lsd1(j)]]=j; } // Counting sort on MSD for (j=0;j=0;j--) { count[msd2[j]]--; msd3[count[msd2[j]]]=msd2[j]; pos3[count[msd2[j]]]=pos2[j]; } printf("POS MSD LSD - after radix sort\n"); for (j=0;j