Пример #1
0
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);
}
Пример #2
0
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); 
}
Пример #3
0
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);
}
Пример #4
0
void ssort2main(unsigned char **a, int n) { ssort2(a, n, 0); }
Пример #5
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);
}
Пример #6
0
void multikey2(string a[], size_t n) { ssort2(a, n, 0); }