
常用软件类: |
|杀毒安全 | |联络聊天 | |网络软件 | |多媒体类 | |系统工具 | |图形图像 | |系统工具 | |应用软件 | |行业软件 |
开发设计类: |
|动画制作 | |图像处理 | |3D设计 | |操作系统 | |站长学院 | |网络相关 | |WEB设计 | |数据库类 | |程序开发 |
void quicksort(Item a[], int l, int r){int i = l-1, j = r, p = l-1, q = r; Item v = a[r];if (r <= l) return;for (;;) {while (a[++i] < v) ;while (v < a[--j]) if (j == l) break;if (i >= j) break;exch(a[i], a[j]);if (a[i] == v) { p++; exch(a[p], a[i]); }if (v == a[j]) { q--; exch(a[j], a[q]); }}exch(a[i], a[r]); j = i-1; i = i+1;for (k = l; k < p; k++, j--) exch(a[k], a[j]);for (k = r-1; k > q; k--, i++) exch(a[i], a[k]);quicksort(a, l, j);quicksort(a, i, r);}但快速排序是采用分治法进行排序,因此有函数的递归调用。这就给用宏实现算法带来困难。没有办法,只好用堆栈来模拟了。但堆栈有可能溢出,在溢出的时候还是要用libc的qsort()来对未排序的部分数据进行排序,但一但情况下是用不到的。最后完成的排序算法如下(其中在数据量较少时转而用插入排序是我增加的内容): #define LIBCSwap(x, y, t) (t) = (x); (x) = (y); (y) = (t)#define LIBCSimpleLt(x, y) ((x) < (y))#define LIBCSimpleEq(x, y) ((x) == (y))extern int LIBCIntCmp(const void *x, const void *y);#define LIBCQuickSort(TYPE, pDat, nCnt, pLtFunc, pEqFunc, pCmpFunc) \do {\int stack[1024], top = 1, l, r, k, i, j, p, q; \TYPE v, t; \/* stack保存要排序数据的起止点 */stack[0] = 0; \stack[1] = (nCnt) - 1; \while (top >= 0) { \r = stack[top--]; l = stack[top--]; \/* 从堆栈中弹出要排序数据范围,即排序[l, r]之间的数据 */i = l - 1; j = r; p = i; q = r; \v = (pDat)[r]; \/* 在数据量比较少时改用插入排序 */if (r <= l + 31) \continue; \for (;;) { \while (pLtFunc((pDat)[++i], v)); \while (pLtFunc(v, (pDat)[--j])) if (j == l) break; \if (i >= j) break; \LIBCSwap((pDat)[i], (pDat)[j], t); \if (pEqFunc((pDat)[i], v)) { p++; LIBCSwap((pDat)[p], (pDat)[i], t); } \if (pEqFunc(v, (pDat)[j])) { q--; LIBCSwap((pDat)[j], (pDat)[q], t); } \} \LIBCSwap((pDat)[i], (pDat)[r], t); \j = i - 1; i++; \for (k = l; k < p; k++, j--) { LIBCSwap((pDat)[k], (pDat)[j], t); } \for (k = r - 1; k > q; k--, i++) { LIBCSwap((pDat)[i], (pDat)[k], t); } \if (top < 1019){ \/* 相当于递归调用qsort(pDat, l, j) */stack[++top] = l; stack[++top] = j; \/* 相当于递归调用qsort(pDat, i, r) */stack[++top] = i; stack[++top] = r; \} \else { \/* 堆栈溢出,调用libc的qsort() */qsort((pDat), j - l + 1, sizeof(TYPE), pCmpFunc); \qsort((pDat) + i, r - i + 1, sizeof(TYPE), pCmpFunc); \} \} \/* 插入排序 */for (i = 1; i < nCnt; i++) { \t = (pDat)[i]; \for (j = i; j > 0 && pLtFunc(t, (pDat)[j - 1]); j--) \(pDat)[j] = (pDat)[j - 1]; \(pDat)[j] = t; \} \} while(0);
这样,用:
LIBCQuickSort(int, pDat, nCnt, LIBCSimpleLt, LIBCSimpleEq, LIBCIntCmp);就可以完成对一个整数数组的排序。在我的机器上,该函数排序整型数据的效率大概是libc中qsort()的2.5倍。