public class QuickSorting {
public static void quickSort(int[] nums, int start, int end){
if (start > end) //终止条件(细品)
return;
int i = start;
int j = end;
int pivot = nums[start]; //基准值选择第一个元素,此处不能用pivot = nums[0],因为是递归函数
while (i < j){
//(1)切记一定要从右边开始(否则最后pivot交换后达不到目的),如果右边一直大于pivot就一直将指针向左推进
while (pivot <= nums[j] && i < j) //注意j可能此时已经等于i,需要加i<j判断
j--;
//如果左边一直小于pivot就一直将指针向右边推进
while (pivot >= nums[i] && i < j) //同上
i++;
//(2)当两边指针无法推进,交换下就能进行下去了!
if (i < j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
//此时的while的退出条件是i和j相等(此时左边小于pivot,右边大于pivot),需要交换nums[start](pivot)和nums[i](或nums[j])
nums[start] = nums[i];
nums[i] = pivot;
//通过对pivot左右两边数组继续递归调用快排
quickSort(nums, start, j - 1);
quickSort(nums, j + 1, end);
}
//最好情况:数组已经有序,通过递归树可以分析得到:算法的二叉树高为logn,宽为n,因此T(n)=O(nlogn)
//最坏情况:数组逆序,T(n)=O(n^2)
//平均复杂度:O(nlogn), 空间复杂度O(1)
public static void main(String[] args){
int[] nums = {2,0,1,9,1,0,2,8};
quickSort(nums, 0, nums.length - 1);
for (int num: nums)
System.out.print(num+" ");
}
}