void ssort2(char **a, int n, int depth,int* index) { int d, r, partval; int Diff=0; char **pa, **pb, **pc, **pd, **pl, **pm, **pn, *t; //~ if (n < 10) { //~ inssort(a, n, depth); //~ return; //~ } pl = a; pm = a + (n/2); pn = a + (n-1); if (n > 30) { // On big arrays, pseudomedian of 9 d = (n/8); pl = med3(pl, pl+d, pl+2*d); pm = med3(pm-d, pm, pm+d); pn = med3(pn-2*d, pn-d, pn); } pm = med3(pl, pm, pn); Diff=pm-a; int *IndexA,*IndexB,*IndexC,*IndexD,*IndexN; swap2(a, pm); swap2Index(index,index+Diff); partval = ptr2char(a); pa = pb = a + 1; pc = pd = a + n-1; IndexA=IndexB=index+1; IndexC=IndexD=index+n-1; for (;;) { while (pb <= pc && (r = ptr2char(pb)-partval) <= 0) { if (r == 0) { swap2(pa, pb);swap2Index(IndexA, IndexB);pa++;IndexA++; } pb++; IndexB++; } while (pb <= pc && (r = ptr2char(pc)-partval) >= 0) { if (r == 0) { swap2(pc, pd); swap2Index(IndexC, IndexD);pd--;IndexD-- ;} pc--; IndexC--; } if (pb > pc) break; swap2(pb, pc); swap2Index(IndexB,IndexC); pb++; IndexB++; pc--; IndexC--; } pn = a + n; IndexN=index+n; r = min(pa-a, pb-pa); vecswap2(a, pb-r, r); vecswap2Index(index,IndexB-r,r); r = min(pd-pc, pn-pd-1); vecswap2(pb, pn-r, r); vecswap2Index(IndexB,IndexN-r,r); if ((r = pb-pa) > 1) ssort2(a, r, depth,index); if (ptr2char(a + r) != 0) ssort2(a + r, pa-a + pn-pd-1, depth+1,index+r); if ((r = pd-pc) > 1) ssort2(a + n-r, r, depth,index+n-r); }
void ssort2main(char **a, int n,int* index) { for (int i=0;i<n;i++) //printf("a=%p ,*a=%c\n",a[i],*a[i]) ; printf("Enter ssort2main\n"); ssort2(a, n, 0,index); }
void ssort2(unsigned char **a, int n, int depth) { int d, r, partval; unsigned char **pa, **pb, **pc, **pd, **pl, **pm, **pn, *t; if (n < 10) { inssort(a, n, depth); return; } pl = a; pm = a + (n/2); pn = a + (n-1); if (n > 30) { d = (n/8); pl = med3(pl, pl+d, pl+2*d); pm = med3(pm-d, pm, pm+d); pn = med3(pn-2*d, pn-d, pn); } pm = med3(pl, pm, pn); swap2(a, pm); partval = ptr2char(a); pa = pb = a + 1; pc = pd = a + n-1; for (;;) { while (pb <= pc && (r = ptr2char(pb)-partval) <= 0) { if (r == 0) { swap2(pa, pb); pa++; } pb++; } while (pb <= pc && (r = ptr2char(pc)-partval) >= 0) { if (r == 0) { swap2(pc, pd); pd--; } pc--; } if (pb > pc) break; swap2(pb, pc); pb++; pc--; } pn = a + n; r = min(pa-a, pb-pa); vecswap2(a, pb-r, r); r = min(pd-pc, pn-pd-1); vecswap2(pb, pn-r, r); if ((r = pb-pa) > 1) ssort2(a, r, depth); if (ptr2char(a + r) != 0) ssort2(a + r, pa-a + pn-pd-1, depth+1); if ((r = pd-pc) > 1) ssort2(a + n-r, r, depth); }
void ssort2main(unsigned char **a, int n) { ssort2(a, n, 0); }
void tester(int start, int end, int step) { FILE *f = fopen("tempi.csv", "w+"); struct timeval start1, end1; struct timeval start2, end2; struct timeval start3, end3; double tot1, tot2, tot3; int a1[end]; int a2[end]; int a3[end]; for (; start <= end; start += step) { printf("testo con %d\n", start); fillRandomArray(a1, start, start / 5); copyArray(a1, a2, start); copyArray(a1, a3, start); gettimeofday(&start1, NULL); ssort(a1, start); gettimeofday(&end1, NULL); tot1 = (end1.tv_sec - start1.tv_sec) * 1000.0; // sec to ms tot1 += (end1.tv_usec - start1.tv_usec) / 1000.0; // us to ms gettimeofday(&start2, NULL); ssort2(a2, start); gettimeofday(&end2, NULL); tot2 = (end2.tv_sec - start2.tv_sec) * 1000.0; // sec to ms tot2 += (end2.tv_usec - start2.tv_usec) / 1000.0; // us to ms gettimeofday(&start3, NULL); isort(a3, start); gettimeofday(&end3, NULL); tot2 = (end3.tv_sec - start3.tv_sec) * 1000.0; // sec to ms tot2 += (end3.tv_usec - start3.tv_usec) / 1000.0; // us to ms printf("tempo selection = %.4f \ntempo selectionMax = %.4f \ntempo insertion = %f\n", tot1, tot2, tot3); if (sorted(a1, start)) printf("a e' ordinato\n"); else printf("a non e' oridinato\n"); if (sorted(a2, start)) printf("b e' ordinato\n"); else printf("b non e' oridinato\n"); if (sorted(a3, start)) printf("c e' ordinato\n"); else printf("c non e' oridinato\n"); fprintf(f, "%d,%5.4f,%5.4f,%5.4f\n", start, tot3, tot1, tot2); /* fprintf(f, "----Tempo di esecuzione degli algoritmi di ordinamento con %d elementi----\n\n", start); fprintf(f, "Insertion Sort --> : \t%5.4f secondi\n", tot3); fprintf(f, "Selection Sort con estrazioni successive del minimo --> : \t%5.4f secondi\n", tot1); fprintf(f, "Selection Sort con estrazioni successive del massimo --> : \t%5.4f secondi\n\n\n", tot2); */ } fclose(f); }
void multikey2(string a[], size_t n) { ssort2(a, n, 0); }