qsort 微软内部实现

void __fileDECL qsort (
					   void *base,
					   size_t num,
					   size_t width,
					   int (__fileDECL *comp)(const void *, const void *)
					   )
#endif  /* __USE_CONTEXT */
{
	char *lo, *hi;              /* ends of sub-array currently sorting */
	char *mid;                  /* points to middle of subarray */
	char *loguy, *higuy;        /* traveling pointers for partition step */
	size_t size;                /* size of the sub-array */
	char *lostk[STKSIZ], *histk[STKSIZ];
	int stkptr;                 /* stack for saving sub-array to be processed */
	/* validation section */
	_VALIDATE_RETURN_VOID(base != NULL || num == 0, EINVAL);
	_VALIDATE_RETURN_VOID(width > 0, EINVAL);
	_VALIDATE_RETURN_VOID(comp != NULL, EINVAL);
	if (num < 2)
		return;                 /* nothing to do */
	stkptr = 0;                 /* initialize stack */
	lo = (char *)base;
	hi = (char *)base + width * (num-1);        /* initialize limits */

recurse:

	size = (hi - lo) / width + 1;        /* number of el's to sort */
	if (size <= CUTOFF) {
		__SHORTSORT(lo, hi, width, comp, context);
	}
	else {

		if (__COMPARE(context, lo, mid) > 0) {
			swap(lo, mid, width);
		}
		if (__COMPARE(context, lo, hi) > 0) {
			swap(lo, hi, width);
		}
		if (__COMPARE(context, mid, hi) > 0) {
			swap(mid, hi, width);
		}
		loguy = lo;
		higuy = hi;
		for (;;) {
			if (mid > loguy) {
				do  {
					loguy += width;
				} while (loguy < mid && __COMPARE(context, loguy, mid) <= 0);
			}
			if (mid <= loguy) {
				do  {
					loguy += width;
				} while (loguy <= hi && __COMPARE(context, loguy, mid) <= 0);
			}
			do  {
				higuy -= width;
			} while (higuy > mid && __COMPARE(context, higuy, mid) > 0);
			if (higuy < loguy)
				break;
			swap(loguy, higuy, width);

			if (mid == higuy)
				mid = loguy;
		}
		higuy += width;
		if (mid < higuy) {
			do  {
				higuy -= width;
			} while (higuy > mid && __COMPARE(context, higuy, mid) == 0);
		}
		if (mid >= higuy) {
			do  {
				higuy -= width;
			} while (higuy > lo && __COMPARE(context, higuy, mid) == 0);
		}
		if ( higuy - lo >= hi - loguy ) {
			if (lo < higuy) {
				lostk[stkptr] = lo;
				histk[stkptr] = higuy;
				++stkptr;
			}                           /* save big recursion for later */

			if (loguy < hi) {
				lo = loguy;
				goto recurse;           /* do small recursion */
			}
		}
		else {
			if (loguy < hi) {
				lostk[stkptr] = loguy;
				histk[stkptr] = hi;
				++stkptr;               /* save big recursion for later */
			}

			if (lo < higuy) {
				hi = higuy;
				goto recurse;           /* do small recursion */
			}
		}
	}
	--stkptr;
	if (stkptr >= 0) {
		lo = lostk[stkptr];
		hi = histk[stkptr];
		goto recurse;           /* pop subarray from stack */
	}
	else
		return;                 /* all subarrays done */
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值