快速排序(填坑与交换)

关于快速排序,可以参考以下文章:

  1. 填坑
  2. 交换

注意:填坑的本质就是交换,只不过交换把两次填坑合并为一次交换过程而已。

我自己也对代码进行了梳理:

填坑

public void quickSort(int[] nums,int low,int high){
		/*
		 * 由于快速排序需要递归,递归的每层作用的数据结构其实是原数组上的一部分,所以参数中引入low和high
		 * 本快速排序中关于元素位置的调整使用填坑法。
		 */
		if(low<high){
			//只有low<high时,才进行排序;否则,low==high说明是单个元素,不排序
			int curr = nums[low];//记录主元
			int i = low;
			int j = high;
			while(i<j){
				/*
				 * 主元选最左侧元素时,先移动右指针,这是基于最后i==j的情况设计的。
				 * 试想,上次i的停留位置,被交换过来一个小于主元的元素,
				 * 当j--移动到i==j循环结束时,此时i、j共同指向的这个元素是i之前指向的一个比主元小的元素,
				 * 因此可以理所应当地将其与位于最左边的主元进行交换。
				 * 同理,当主元选最右侧元素时,先移动的应该是左指针。
				 */
				while(i<j && nums[j]>=curr){
					j--;
				}
				if(i<j){
					//找到一个比主元小的右侧元素,填上一个坑
					nums[i] = nums[j];
					i++;
				}
				while(i<j && nums[i]<curr){
					i++;
				}
				if(i<j){
					//找到一个比主元大的左侧元素,填上一个坑
					nums[j] = nums[i];
					j--;
				}
			}
			//i==j,指向主元的最终位置,用主元填这个坑
			nums[i] = curr;
			//分治策略
			quickSort(nums,low,i-1);
			quickSort(nums,i+1,high);
		}
	}

交换

public void quickSort(int[] nums,int low,int high){
		/*
		 * 由于快速排序需要递归,递归的每层作用的数据结构其实是原数组上的一部分,所以参数中引入low和high
		 * 本快速排序中关于元素位置的调整使用交换法。
		 */
		if(low<high){
			//只有low<high时,才进行排序;否则,low==high说明是单个元素,不排序
			int i=low;
			int j=high;
			int curr=nums[low];//记录主元
			while(i<j){
				/*
				 * 主元选最左侧元素时,先移动右指针,这是基于最后i==j的情况设计的。
				 * 试想,上次i的停留位置,被交换过来一个小于主元的元素,
				 * 当j--移动到i==j循环结束时,此时i、j共同指向的这个元素是i之前指向的一个比主元小的元素,
				 * 因此可以理所应当地将其与位于最左边的主元进行交换。
				 * 同理,当主元选最右侧元素时,先移动的应该是左指针。
				 */
				while(i<j && nums[j]>curr){
					j--;
				}
				while(i<j && nums[i]<=curr){
					i++;
				}
				if(i<j){
					//将主元最终位置左侧比主元大的元素与右侧比主元小的元素进行交换
					int temp = nums[i];
					nums[i] = nums[j];
					nums[j] = temp;
				}
			}
			//将主元与最终位置上的元素位置互换
			nums[low] = nums[i];
			nums[i] = curr;
			//分治策略
			quickSort(nums,low,i-1);
			quickSort(nums,i+1,high);
		}
	}

性能比较

对leetcode第912题,使用两种方法进行提交,性能表现如下:
性能比较

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值