public class QuickSort {
public static void quickSort(int[] arr, int left, int right){
int temp;
//要排序数组的起始位置
int i = left;
//要排序数组的结束位置
int j = right;
//当起始位置小于结束位置时,进行排序,否则不执行任何操作
if (left < right){
// temp存放基准数("枢轴"),此时相当于把基准数存到temp中了,然后arr[left]即arr[i]的位置就相当于空出来了
temp = arr[left];
// 下面这个循环完成了一趟排序,即数组中小于temp的元素放在左边,大于temp的元素放在右边。左边和右边的分界点就是temp的最终位置
while (i != j){
// 先从右往左扫描,只要比temp大,j就向左移,直到找到一个比"枢轴"temp小的数
while (i < j && arr[j] > temp){ --j; }
// 找到一个比temp小的数,判断一下如果左指针小于右指针(即i和j相对位置还满足前后关系)
if (i < j){
// 则把该数放到temp左边,即把arr[j]放到空出的arr[i]位置,现在arr[j]的位置空出了,然后再从左往右扫描
arr[i] = arr[j];
// i指针右移一位(开始从左边扫描)
i++;
}
// 再从左往右扫描,只要比temp小,i就向右移,直到找到一个比"枢轴"temp大的数
while (i < j && arr[i] < temp){ ++i; }
// 找到一个比temp大的数,判断一下如果左指针小于右指针(即i和j相对位置还满足前后关系)
if (i < j){
// 则把该数放到temp右边,把该数arr[i]放到上次空出的arr[j]位置,然后再从右往左扫描
arr[j] = arr[i];
// j指针左移一位(又开始从右边扫描)
j--;
}
}
// 当i==j时,将一开始存好的"枢轴"temp放在最终位置(把数组分成两部分了),一趟快速排序完成
arr[i] = temp;
// temp的左边部分再进行快速排序(依次递归实现)
quickSort(arr, left, i-1);
// temp的右边部分再进行快速排序(依次递归实现)
quickSort(arr, i+1, right);
}
}
public static void main(String[] args){
int[] arr = {4,6,7,1,2,3,5};
quickSort(arr, 0, arr.length-1);
for (int a : arr){
System.out.print(a+" ");
}
}
}
运行结果: