⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nqsort.c

📁 Arithmetic coding source code. A very good software for arithmetic coding.
💻 C
字号:
/* * Copyright (c) 1992 The Regents of the University of California. * All rights reserved. * *//* * Qsort routine from J. Bentley & M. D. McIlroy's "Engineering a Sort Function". */#define swapcode(TYPE, parmi, parmj, n) { \	long i = (n) / sizeof (TYPE); \	register TYPE *pi = (TYPE *) (parmi); \	register TYPE *pj = (TYPE *) (parmj); \	do { \		register TYPE	t = *pi;	\		*pi++ = *pj;			\		*pj++ = t;			\        } while (--i > 0);	\}#define SWAPINIT(a, es) swaptype = ((char *)a - (char *)0) % sizeof(long) || \	es % sizeof(long) ? 2 : es == sizeof(long)? 0 : 1;voidswapfunc(char *a, char *b, int n, int swaptype) {	if(swaptype <= 1) 		swapcode(long, a, b, n)	else		swapcode(char, a, b, n)}#define swap(a, b) \	if (swaptype == 0) { \		long t = *(long *)(a); \		*(long *)(a) = *(long *)(b); \		*(long *)(b) = t; \	} else \		swapfunc(a, b, es, swaptype)#define vecswap(a, b, n) 	if ((n) > 0) swapfunc(a, b, n, swaptype)char *med3(char *a, char *b, char *c, int (*cmp)(char * , char *)) {	return cmp(a, b) < 0 ?	       (cmp(b, c) < 0 ? b : (cmp(a, c) < 0 ? c : a ))              :(cmp(b, c) > 0 ? b : (cmp(a, c) < 0 ? a : c ));}#define min(a, b) (a) < (b) ? a : bvoidnqsort(char *a, unsigned int n, int es, int (*cmp)(char *, char *)) {	char *pa, *pb, *pc, *pd, *pl, *pm, *pn;	int d, r, swaptype;	SWAPINIT(a, es);	if (n < 7) {		for (pm = (char *)a + es; pm < (char *)a + n * es; pm += es)			for (pl = pm; pl > (char *)a && cmp(pl - es, pl) > 0; pl -= es)				swap(pl, pl - es);		return;	}	pm = (char *)a + (n / 2) * es;	if (n > 7) {		pl = (char *)a;		pn = (char *)a + (n - 1) * es;		if (n > 40) {			d = (n / 8) * es;			pl = med3(pl, pl + d, pl + 2 * d, cmp);			pm = med3(pm - d, pm, pm + d, cmp);			pn = med3(pn - 2 * d, pn - d, pn, cmp);		}		pm = med3(pl, pm, pn, cmp);	}	swap(a, pm);	pa = pb = (char *)a + es;	pc = pd = (char *)a + (n - 1) * es;	for (;;) {		while (pb <= pc && (r = cmp(pb, a)) <= 0) {			if (r == 0) {				swap(pa, pb);				pa += es;			}			pb += es;		}		while (pb <= pc && (r = cmp(pc, a)) >= 0) {			if (r == 0) {				swap(pc, pd);				pd -= es;			}			pc -= es;		}		if (pb > pc)			break;		swap(pb, pc);		pb += es;		pc -= es;	}	pn = a + n * es;	r = min(pa - (char *)a, pb - pa);	vecswap(a, pb - r, r);	r = min(pd - pc, pn - pd - es);	vecswap(pb, pn - r, r);	if ((r = pb - pa) > es)		nqsort(a, r / es, es, cmp);	if ((r = pd - pc) > es)		nqsort(pn - r, r / es, es, cmp);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -