Java快速排序
引言
快速排序一定是面试中最常见的算法题了,最近在准备面试,所以再来把快排复习一下,今天更一下大家能百度到的最常见的快排写法,我也是参照其他博客内容自己写了一遍,然后写了下注释,建议要搞懂,还是自己默写一遍,达到手撕快排的水平,这样面试再也不会怂了。
当然,要面试BAT等互联网,光会手写快排还是远远不够的,什么快排优化了,复杂度,是否原地排序了,这些都得要搞懂,之后有时间再更新一下算法4里的快排,至于快排原理,大可随便百度,千篇一律的那个文章,静下心来慢慢也是能看懂的。
先贴一个极客时间的快排介绍:
/**
* @program: JavaSpecialityDeep
* @author: Mr.Zerah
* @create: 2019-08-20 22:48
* @description: Java快速排序
**/
public class QuickSort {
public static void main(String[] args) {
int [] arr = {10,7,2,4,7,62,3,4,2,1,8,9,19};
quickSort(arr, 0, arr.length -1);
for (int i = 0; i < arr.length; i++) {
System.out.print(" "+ arr[i]);
}
}
public static void quickSort(int []arr, int low, int high){
int i ,j,temp,target;
if (low > high) return;
i =low;
j =high;
//基准数
target = arr[low];
while (i<j){
//从右往左扫描,当找到比基准数小的数跳出循环
while (target <= arr[j] && i< j){
j--;
}
//从左往右扫描,当找到比基准数大的数则跳出循环
while (target >= arr[i] && i <j){
i++;
}
if (i< j){
temp = arr[j];
arr [j] = arr[i];
arr [i] = temp;
}
}
//执行完上面一次循环,即当前基准数arr[i]左边的数均以小于基准数target,
arr[j]右边的数均大于基准数,但是基准数的位置还没有排定
//然后将基准数与I和j相等的数字交换,以确定基准数的位置
arr [low] = arr[i];
arr [i] = target;
//递归调用左半数组
quickSort(arr,low , j-1);
//递归调用右半数组
quickSort(arr, j+1, high);
}
}
关于交换基准数和arr[i]交换位置的过程再特别通过debug说明一下,以便有个更清晰的认识
//然后将基准数与I和j相等的数字交换,以确定基准数的位置
arr [low] = arr[i];
arr [i] = target;
参考
https://blog.csdn.net/qq_36186690/article/details/82470451