示例#1
0
void
qsort(char *a, unsigned n, int es, int (*fc) (void))
{
	qscmp = fc;
	qses = es;
	qs1(a, a + n * es);
}
示例#2
0
文件: qsort.c 项目: pvanevery/school
/*------------------------------------------------------------------------
 *  qsort  -  Use quicksort to sort an array
 *------------------------------------------------------------------------
 */
void	qsort(
	  char		*a,		/* Array to sort		*/
	  unsigned	n,		/* Length of the array		*/
	  int		es,		/* Pivot value			*/
	  int		(*fc)(char *, char *)	/* Comparison function	*/
	)
{
    qscmp = fc;
    qses = es;
    qs1(a, a + n * es);
}
示例#3
0
文件: qsort.c 项目: pvanevery/school
/*------------------------------------------------------------------------
 *  qs1  -  internal quicksort function
 *------------------------------------------------------------------------
 */
static void	qs1(
		  char		*a,
		  char		*l
		)
{
    register char *i, *j;
    register int es;
    char *lp, *hp;
    int c;
    unsigned n;

    es = qses;

  start:
    if ((n = l - a) <= es)
    {
        return;
    }
    n = es * (n / (2 * es));
    hp = lp = a + n;
    i = a;
    j = l - es;
    for (;;)
    {
        if (i < lp)
        {
            if ((c = (*qscmp) (i, lp)) == 0)
            {
                qsexc(i, lp -= es);
                continue;
            }
            if (c < 0)
            {
                i += es;
                continue;
            }
        }

      loop:
        if (j > hp)
        {
            if ((c = (*qscmp) (hp, j)) == 0)
            {
                qsexc(hp += es, j);
                goto loop;
            }
            if (c > 0)
            {
                if (i == lp)
                {
                    qstexc(i, hp += es, j);
                    i = lp += es;
                    goto loop;
                }
                qsexc(i, j);
                j -= es;
                i += es;
                continue;
            }
            j -= es;
            goto loop;
        }

        if (i == lp)
        {
            if (lp - a >= l - hp)
            {
                qs1(hp + es, l);
                l = lp;
            }
            else
            {
                qs1(a, lp);
                a = hp + es;
            }
            goto start;
        }

        qstexc(j, lp -= es, i);
        j = hp -= es;
    }
}