快速排序java实现
//快速排序
//使用递归
public static void quickSort(int[] arr,int low,int high){
//递归结束条件:指定数组范围内的元素数量小于等于1
if(low >= high){
return;
}
//建立左右哨兵
int left = low, right = high;
//左哨兵<右哨兵
while(left < right){
//选择最左边的数作为基准数
//先看右边,右哨兵大于或等于基准数,而且左哨兵小于右哨兵(防止越界)
while(arr[right] >= arr[low] && left < right){
right--;
}
//再看左边
while(arr[left] <= arr[low] && left < right){
left++;
}
//当两边都不满足时,交换哨兵的值
int i = arr[left];
arr[left] = arr[right];
arr[right] = i;
}
//跳出循环表示此时left == right,交换哨兵和基准值
int temp = arr[low];
arr[low] = arr[left];
arr[left] = temp;
//这里左右哨兵先行顺序要注意,前面我们选择了最左元素作为基准元素
//跳出循环后会交换哨兵和基准值
//因为基准值在左边,为了使交换后的排序正确,一定要确保最后的哨兵值比基准值小
//例子:6 1 4(左) 3 7(右) 9 10
//倒数第二次交换后得到上面的顺序
//1.左哨兵先走,到7停下,左右哨兵相等,退出循环,哨兵、基准交换,出错----左哨兵先走,最后的哨兵值一定比基准值大
//2.右哨兵先走,走到3停下,然后到左哨兵走,走到3发现两者相等,停下,跳出循环,哨兵基准交换,正确---右哨兵先走,最后的哨兵值一定比基准值小。
// System.out.println(Arrays.toString(arr));
//递归调用
quickSort(arr, low, left-1);
quickSort(arr, left+1, high);
}
时间复杂度:递归时间复杂度 × 函数自身时间复杂度
T(n) = log(n) × n = nlog(n)
//递归实现,递归了log(n)次
quickSort(arr, low, left-1);
quickSort(arr, left+1, high);
//仔细看这个while循环,一个while循环里面套了两个while循环,
//分析可以发现该循环最后的工作right--和left++,
//这两个操作加起来是n次,
//所以不管多少个循环,最后一定是循环了n次
while(left < right){
while(arr[right] >= arr[low] && left < right){
right--;
}
while(arr[left] <= arr[low] && left < right){
left++;
}
int i = arr[left];
arr[left] = arr[right];
arr[right] = i;
}
空间复杂度:O(n) = 1