快速排序极高效、极精简代码

12 篇文章 0 订阅
10 篇文章 0 订阅

基本思路:

1.首先将首元素作为枢轴,一遍排序后使得枢轴元素的左子组元素全小于枢轴,右子组元素全大于等于枢轴。

2.接着递归引用,分别对左子组和右子组排序。

package quintessence;

public class 快速排序 {

	public static void quickSort(int array[], int begin, int end) {
		if (begin >= end)
			return;

		int index = begin; // index记录枢轴后面首个大于等于枢轴的元素位置,初始化为枢轴位置
		int pivot = array[begin]; // 设置首个元素为枢轴
		for (int i = begin + 1; i <= end; i++) { // 查找小于枢轴的元素位置i
			if (array[i] < pivot) {
				index++;
				/*
				 * 因为初始化i就比index大1,并且满足判断条件元素小于枢轴才有index++, 所以一定index++ <= i。
				 * 而i已经通过了index到i之间的这些元素, 说明这些元素都大于等于枢轴。 因此index++处一定是大于等于枢轴的元素,i处一定是小于枢轴的元素。
				 * (不好理解可以画图试试看)
				 */

				if (index != i) {
					int temp = array[index]; // index处与i处元素交换
					array[index] = array[i];
					array[i] = temp;
				}
			}
		}

		array[begin] = array[index];
		/*
		 * 因为index每次移动一个位置 所以最后一次交换后的index前面全是小于枢轴的元素(除了枢轴自身) 后面全是大于等于枢轴的元素,
		 * 因此把index处的元素与枢轴交换, 达到令枢轴前面全小于枢轴,后面全大于等于枢轴的目的
		 */
		array[index] = pivot;

		quickSort(array, begin, index); // 递归将左子组排序
		quickSort(array, index + 1, end); // 递归将右子组排序
	}

}

纯净代码:

public static void quickSort(int array[], int begin, int end) {
		if (begin >= end)
			return;

		int index = begin;
		int pivot = array[begin];
		for (int i = begin + 1; i <= end; i++) {
			if (array[i] < pivot) {
				index++;
				if (index != i) {
					int temp = array[index];
					array[index] = array[i];
					array[i] = temp;
				}
			}
		}

		array[begin] = array[index];
		array[index] = pivot;

		quickSort(array, begin, index);
		quickSort(array, index + 1, end);
	}

参考自作者:智者之行zip

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值