java实现 快速排序 QuickSort

温馨提示想看C语言版的源代码【请点击这里】

下面是我总结的快速排序的思想、步骤、示意图,源码中的注释很详细的哦
在这里插入图片描述
源码:

package algorithmBeauty.dataStructure.sort;
/**
 * @author : HuXuehao
 * @version : 
*/
/* 
 * 过程:
 * 1. 提供一个排序的方法
 * 2. 提供一个获取轴点的位置的方法
 * 3. 将利用1(递归)将轴点的左右都进行排序
 * 
 */
@SuppressWarnings("unused")
public class QuickSort {
	//排序
	protected void sort(int[] array) {
		//对那个范围进行排序
		//因为是左闭右开,所以end的值应该是真正参与排序的末尾的元素的索引值+1
		sort(0, array.length, array);
	}
	
	
	/*
	 * 对[begin, end)范围内的元素进行排序
	 * 因为是左闭右开,所以end的值应该是真正参与排序的末尾的元素的索引值+1
	 */
	private void sort(int begin, int end, int[] array) {
		//end - begin < 2 表示参与排序的个数小于2个。(因为是左闭右开,所以end的值应该是真正参与排序的末尾的元素的索引值+1)
		if(end - begin < 2) return;
		
		//确认begin作为轴点时,它所对应的索引值pivotIndex
		int pivotIndex = getPivotIndex(begin, end, array);
		 
		/*
		 * 对轴点的左边进行排序
		 * pivotIndex就相当于轴点左边参与排序的末尾的元素的索引值+1
		 */
		sort(begin, pivotIndex, array); 
		
		/*
		 * 对轴点的右边进行排序
		 * end就相当于轴点右边参与排序的末尾的元素的索引值+1
		 */
		sort(begin+1, end, array); 
	}
	
	
	/*
	 * 获取[begin, end)范围内的轴点
	 * return : 轴点的索引
	 */
	private int getPivotIndex(int begin, int end, int[] array) {
		//备份开始时的begin,用于比较时使用和最后给轴点赋值使用
		int temp = array[begin];
		
		/*
		 * end肯定是要进行减1的,因为开始时排序时 end 是参与排序的末尾元素索引的下一个值,
		 * 减一之后,end才是参与排序的末尾元素
		 */
		end--;
		
		//快排的条件(确认轴点的条件)。最终轴点的左边都是不大于轴点值的,轴点的右边都是不小于轴点值的
		while(begin < end) {
			//这里的while暂时先不要它存在的意义
			while (begin < end) {
				//从右往左进行判断
				if (cmp(temp, array[end]) < 0) { //cmp(temp, array[end]) < 0 => array[end] > begin
					//array[end] > begin,那么我们就不需要管,end前移一个
					end--;
				} else {
					//array[end] !> begin,那么将end赋值给 array[begin]
					array[begin++] = array[end];//begin 先试用 再+1
					
					/*
					 * 当元素调换之后,我们的比较方向就要和现在的相反了。
					 * 本while结束,执行下一个while(从左往右判断)
					 */
					break;
				} 
			}
			
			while (begin < end) {
				//从左往右判断
				if (cmp(temp, array[begin]) > 0) {
					begin++;
				} else {
					array[end--] = array[begin]; 
					//当元素调换之后,本while结束,外层循环一次执行结束,进行
					//下一次执行(首先会执行外层循环中的第一个while(从左往右判断,刚和实现了和现在的比较方向相反了)
					//## 三个while组合使用 刚好符合第一次是从右往左,然后只要有元素调换,那么执行顺序就相反 ##
					break;
				} 
			}
		}
		
		/*
		 * 上面的外层while结束之后,意味值begin == end,那么begin/end位置就是我们要找的轴点,
		 * 将刚开始时的begin赋给轴点
		 */
		array[begin] = temp;
		//返回轴点
		return begin;
	}
	
	
	/*
	 * 比较两个数的大小 
	 * begin > end  返回1
	 * begin < end  返回-1
	 * begin == end  返回0
	 */
	private int cmp(int begin, int end) {
		
		return begin - end;
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值