00001
00007
00008
00009 static int (*qscmp)();
00010 static int qses;
00011 static void qs1(char *, char *);
00012 static void qsexc(char *, char *);
00013 static void qstexc(char *, char *, char *);
00014
00022 void qsort(char *a, unsigned n, int es, int (*fc)())
00023 {
00024 qscmp = fc;
00025 qses = es;
00026 qs1(a, a+n*es);
00027 }
00028
00029
00030 static void qs1(char *a, char *l)
00031 {
00032 register char *i, *j;
00033 register int es;
00034 char *lp, *hp;
00035 int c;
00036 unsigned n;
00037
00038 es = qses;
00039
00040 start:
00041 if((n=l-a) <= es)
00042 { return; }
00043 n = es * (n / (2*es));
00044 hp = lp = a+n;
00045 i = a;
00046 j = l-es;
00047 for(;;)
00048 {
00049 if(i < lp)
00050 {
00051 if((c = (*qscmp)(i, lp)) == 0)
00052 {
00053 qsexc(i, lp -= es);
00054 continue;
00055 }
00056 if(c < 0)
00057 {
00058 i += es;
00059 continue;
00060 }
00061 }
00062
00063 loop:
00064 if(j > hp)
00065 {
00066 if((c = (*qscmp)(hp, j)) == 0)
00067 {
00068 qsexc(hp += es, j);
00069 goto loop;
00070 }
00071 if(c > 0)
00072 {
00073 if(i == lp)
00074 {
00075 qstexc(i, hp += es, j);
00076 i = lp += es;
00077 goto loop;
00078 }
00079 qsexc(i, j);
00080 j -= es;
00081 i += es;
00082 continue;
00083 }
00084 j -= es;
00085 goto loop;
00086 }
00087
00088
00089 if(i == lp)
00090 {
00091 if(lp-a >= l-hp)
00092 {
00093 qs1(hp+es, l);
00094 l = lp;
00095 }
00096 else
00097 {
00098 qs1(a, lp);
00099 a = hp+es;
00100 }
00101 goto start;
00102 }
00103
00104
00105 qstexc(j, lp -= es, i);
00106 j = hp -= es;
00107 }
00108 }
00109
00110 static void qsexc(char *i, char *j)
00111 {
00112 register char *ri, *rj, c;
00113 int n;
00114
00115 n = qses;
00116 ri = i;
00117 rj = j;
00118 do
00119 {
00120 c = *ri;
00121 *ri++ = *rj;
00122 *rj++ = c;
00123 } while(--n);
00124 }
00125
00126 static void qstexc(char *i, char *j, char *k)
00127 {
00128 register char *ri, *rj, *rk;
00129 int c;
00130 int n;
00131
00132 n = qses;
00133 ri = i;
00134 rj = j;
00135 rk = k;
00136 do
00137 {
00138 c = *ri;
00139 *ri++ = *rk;
00140 *rk++ = *rj;
00141 *rj++ = c;
00142 } while(--n);
00143 }