基本思路:
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