qsort

From
Ianos Gnatiuc (2:469/303.55)
To
Anatoly Svishev
Date
2002-10-09T19:33:15Z
Area
RU.ALGORITHMS
Hello Anatoly!

04 Oct 02 23:49, you wrote to All:



#define CUTOFF 8
#define SWAP(A, B) tmp = A; A = B; B = tmp;

int lostk[30], histk[30];
int stkptr;

void iqsort(int *base, unsigned num)
{
    int tmp;
    int lo = 0, hi = num-1, mid;
    int loguy, higuy;
    unsigned size;

    stkptr = 0;

recurse:

    size = hi - lo + 1;

    if (size <= CUTOFF)
    {
        int p, max;

        while (hi > lo)
        {
            max = base[lo];
            for (p = lo+1; p <= hi; p++)
            {
                if (base[p] > max) max = base[p];
            }

            SWAP(max, base[hi]); hi--;
        }
    }
    else
    {
        mid = lo + size/2;
        SWAP(base[mid], base[lo]); loguy = lo; higuy = hi+1;

        for (;;)
        {
            do loguy++; while ((loguy <= hi) && (base[loguy] <= base[lo]));
            do higuy--; while ((higuy >  lo) && (base[higuy] >= base[lo]));
            if (higuy < loguy) break;
            SWAP(base[loguy], base[higuy]);
        }

        SWAP(base[lo], base[higuy]);

        if ((higuy - lo - 1) >= (hi - loguy))
        {
            if ((lo+1) < higuy)
            {
                lostk[stkptr] = lo; histk[stkptr] = higuy-1; stkptr++;
            }

            if (loguy < hi) { lo = loguy; goto recurse; }
        }
        else
        {
            if (loguy < hi)
            {
                lostk[stkptr] = loguy; histk[stkptr] = hi; stkptr++;
            }

            if ((lo + 1) < higuy) { hi = higuy-1; goto recurse; }
        }
    }

    --stkptr;
    if (stkptr >= 0)
    {
        lo = lostk[stkptr]; hi = histk[stkptr]; goto recurse;
    }

    return;
}



Ianos

... [WinAmp is not installed]  EMAIL: ssianky[at][hotmail | yahoo].com
--- GoldED+/W32 1.1.4.7
 * Origin: SS Ianky - (373-2) 534966 (2:469/303.55)