参考了这位大佬的博客:https://blog.youkuaiyun.com/qq_26122557/article/details/79458649
强烈建议看一看这位大佬的佳作,图文并茂,很容易理解
花样繁多的排序一直是面试官钟爱的问题,可能你写得一手熟练的业务代码,但面对这种突如其来涉及算法的问题先感到手足无措,除了基础外,这类问题还带一些对算法思想的考察,或者说,我个人认为是更偏向于考察后者的。
排序方式有很多,经典如冒泡,冒泡排序这里就不多说了,快速排序可以说是冒泡的升级版
我们假设现在有一个长度为N的数组,里面存了N个数字,要对这些数字按照从小到大进行排序,这就是完美符合快速排序应用的场景
首先概括一下大致的思想和操作流程
1 从这N个数里随便选一个数,可以就选第一个,然后从数组的最左侧和最右侧往数组中间检索,当左侧出现第一个大于选定数字和右侧出现第一个小于选定数字的时候,交换它们在数组中的位置,然后继续从数组最左侧和最右侧往中间检索,重复上述条件的交换,直到向右和向左的遍历都到了相同位置(数组中间),交换选定数字与数组中间的数
2 对数组左侧 右侧分别执行上述操作(此时选定数字在数组中间)
快速排序基于分治的思想,从上面的操作就可以看出来,像上述操作一遍后,数组左侧的数字都小于右侧,而选定数字位于中间
代码我就直接贴过来了
public class QuickSort {
public static void quickSort(int[] arr,int low,int high){
int i,j,temp,t;
if(low>high){
return;
}
i=low;
j=high;
//temp就是基准位
temp = arr[low];
while (i<j) {
//先看右边,依次往左递减
while (temp<=arr[j]&&i<j) {
j--;
}
//再看左边,依次往右递增
while (temp>=arr[i]&&i<j) {
i++;
}
//如果满足条件则交换
if (i<j) {
t = arr[j];
arr[j] = arr[i];
arr[i] = t;
}
}
//最后将基准为与i和j相等位置的数字交换
arr[low] = arr[i];
arr[i] = temp;
//递归调用左半数组
quickSort(arr, low, j-1);
//递归调用右半数组
quickSort(arr, j+1, high);
}
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.println(arr[i]);
}
}
}
输出:
输出为
1
2
2
3
4
4
7
7
8
9
10
19
62