Deleted Added
full compact
qsort.c (17880) qsort.c (17971)
1/*-
2 * Copyright (c) 1992, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 16 unchanged lines hidden (view full) ---

25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
1/*-
2 * Copyright (c) 1992, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright

--- 16 unchanged lines hidden (view full) ---

25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * $Id$
33 * $Id: qsort.c,v 1.4 1996/08/28 20:32:19 bde Exp $
34 */
35
36#include <stdlib.h>
37
38typedef int cmp_t __P((const void *, const void *));
39static inline char *med3 __P((char *, char *, char *, cmp_t *));
40static inline void swapfunc __P((char *, char *, int, int));
41

--- 54 unchanged lines hidden (view full) ---

96 cmp_t *cmp;
97{
98 char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
99 int d, r, swaptype, swap_cnt;
100
101loop: SWAPINIT(a, es);
102 swap_cnt = 0;
103 if (n < 7) {
34 */
35
36#include <stdlib.h>
37
38typedef int cmp_t __P((const void *, const void *));
39static inline char *med3 __P((char *, char *, char *, cmp_t *));
40static inline void swapfunc __P((char *, char *, int, int));
41

--- 54 unchanged lines hidden (view full) ---

96 cmp_t *cmp;
97{
98 char *pa, *pb, *pc, *pd, *pl, *pm, *pn;
99 int d, r, swaptype, swap_cnt;
100
101loop: SWAPINIT(a, es);
102 swap_cnt = 0;
103 if (n < 7) {
104 for (pm = a + es; pm < (char *) a + n * es; pm += es)
105 for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
104 for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es)
105 for (pl = pm; pl > (char *)a && cmp(pl - es, pl) > 0;
106 pl -= es)
107 swap(pl, pl - es);
108 return;
109 }
106 pl -= es)
107 swap(pl, pl - es);
108 return;
109 }
110 pm = a + (n / 2) * es;
110 pm = (char *)a + (n / 2) * es;
111 if (n > 7) {
112 pl = a;
111 if (n > 7) {
112 pl = a;
113 pn = a + (n - 1) * es;
113 pn = (char *)a + (n - 1) * es;
114 if (n > 40) {
115 d = (n / 8) * es;
116 pl = med3(pl, pl + d, pl + 2 * d, cmp);
117 pm = med3(pm - d, pm, pm + d, cmp);
118 pn = med3(pn - 2 * d, pn - d, pn, cmp);
119 }
120 pm = med3(pl, pm, pn, cmp);
121 }
122 swap(a, pm);
114 if (n > 40) {
115 d = (n / 8) * es;
116 pl = med3(pl, pl + d, pl + 2 * d, cmp);
117 pm = med3(pm - d, pm, pm + d, cmp);
118 pn = med3(pn - 2 * d, pn - d, pn, cmp);
119 }
120 pm = med3(pl, pm, pn, cmp);
121 }
122 swap(a, pm);
123 pa = pb = a + es;
123 pa = pb = (char *)a + es;
124
124
125 pc = pd = a + (n - 1) * es;
125 pc = pd = (char *)a + (n - 1) * es;
126 for (;;) {
127 while (pb <= pc && (r = cmp(pb, a)) <= 0) {
128 if (r == 0) {
129 swap_cnt = 1;
130 swap(pa, pb);
131 pa += es;
132 }
133 pb += es;

--- 9 unchanged lines hidden (view full) ---

143 if (pb > pc)
144 break;
145 swap(pb, pc);
146 swap_cnt = 1;
147 pb += es;
148 pc -= es;
149 }
150 if (swap_cnt == 0) { /* Switch to insertion sort */
126 for (;;) {
127 while (pb <= pc && (r = cmp(pb, a)) <= 0) {
128 if (r == 0) {
129 swap_cnt = 1;
130 swap(pa, pb);
131 pa += es;
132 }
133 pb += es;

--- 9 unchanged lines hidden (view full) ---

143 if (pb > pc)
144 break;
145 swap(pb, pc);
146 swap_cnt = 1;
147 pb += es;
148 pc -= es;
149 }
150 if (swap_cnt == 0) { /* Switch to insertion sort */
151 for (pm = a + es; pm < (char *) a + n * es; pm += es)
152 for (pl = pm; pl > (char *) a && cmp(pl - es, pl) > 0;
151 for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es)
152 for (pl = pm; pl > (char *)a && cmp(pl - es, pl) > 0;
153 pl -= es)
154 swap(pl, pl - es);
155 return;
156 }
157
153 pl -= es)
154 swap(pl, pl - es);
155 return;
156 }
157
158 pn = a + n * es;
158 pn = (char *)a + n * es;
159 r = min(pa - (char *)a, pb - pa);
160 vecswap(a, pb - r, r);
161 r = min(pd - pc, pn - pd - es);
162 vecswap(pb, pn - r, r);
163 if ((r = pb - pa) > es)
164 qsort(a, r / es, es, cmp);
165 if ((r = pd - pc) > es) {
166 /* Iterate rather than recurse to save stack space */
167 a = pn - r;
168 n = r / es;
169 goto loop;
170 }
171/* qsort(pn - r, r / es, es, cmp);*/
172}
159 r = min(pa - (char *)a, pb - pa);
160 vecswap(a, pb - r, r);
161 r = min(pd - pc, pn - pd - es);
162 vecswap(pb, pn - r, r);
163 if ((r = pb - pa) > es)
164 qsort(a, r / es, es, cmp);
165 if ((r = pd - pc) > es) {
166 /* Iterate rather than recurse to save stack space */
167 a = pn - r;
168 n = r / es;
169 goto loop;
170 }
171/* qsort(pn - r, r / es, es, cmp);*/
172}