import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int []arr= {1,41,6,2234,122,32,1123,23,1212,3,42,543,12,43,1,44,65,14,2};
sort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
private static void sort(int [] arr,int low,int high) {
//递归返回条件
if(low>=high) {
return;
}
/*
* 为什么要定义i和j来代替low和high呢,因为后续左右区间元素还需要用到
* low和high两个变量,至于key值得引入,其实用arr[low]代替完全没有
* 影响
*/
int j=high;
int i=low;
int key=arr[i];//基准值
/*
* 当这个while内部达到i==j的田间时,while循环终止
*/
while(i<j) {
/*
* 解释一下内层两个while的"i<j":
*
* 当数组元素为{2,3}时,第一次j--后i=j,arr[j]=arr[0]=2=key,不加
* "i<j",则j继续j--,则出现arr[-1],数组下标越界
*/
while(arr[j]>=key&&i<j) {
j--;
}
while(arr[i]<=key&&i<j) {
i++;
}
/*
* i!=j时交换arr[i]和arr[j]
* i=j时交换arr[i]等于arr[j],交换arr[i]和基准处的值
* 不要想着可以 arr[i]=arr[low];arr[low]=arr[j];
* 这是很傻的
*
*/
if(i!=j) {
int temp;
temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}else {
int temp;
temp=arr[j];
arr[j]=arr[low];
arr[low]=temp;
}
}
/*
* 你可能觉得当一个数组中最小元素在第一个的时候,i-1小于0,后续代码中
* 使用arr[i-1]的时候可能数组下标越界,放心,当i-1小于0时首先不满足递
* 归边界条件,递归就会返回。
*/
sort(arr,low,i-1);
/*
* 你可能觉得当一个数组中最大元素在最后的时候,i+1大于0,后续代码中
* 使用arr[i+1]的时候可能数组下标越界,放心,当i+1大于0时首先不满足递
* 归边界条件,递归就会返回。
*/
sort(arr,i+1,high);
}
}
运行结果:
[1, 1, 2, 3, 6, 12, 14, 23, 32, 41, 42, 43, 44, 65, 122, 543, 1123, 1212, 2234]