温馨提示:想看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;
}
}