快速排序的核心思想是分而治之,用于数组排序的时候,如果是按从小到大的排序方式
步骤一:取一个数A点作为参考点,,
步骤二:把数组中A点右边大于A的,都放到A点的左边,然后把A点左边大于等于A的放到A点的右边。得到的数组就是{n个小于A , A , L(数组的长度)-n-1个大于等于A}.
步骤三:这时候体现分而治之的时候了,以A点左边作为新的数组,重复步骤一和步骤er,以A点的右边作为新的数组,也进行步骤一和步骤二,一直递归。递归退出的条件就是子数组只有一个A点。
上面是理论,有点抽象,我来举个形象的。
上面的数组是一条街,街上有身高不等的人分别站在A-H点,此时你要从低到高排序。你选择A点作为突破口,以A点的数值8作为基准,如果可以的话,你直接把8放在一个左边都小于8,右边都大于等于8的位置,显然,我们肯定不知道这个位置在哪。但我们可以这样,先把8放在外面,现在A点空出来了,然后,我们从后街开始向前找,找到G点5比8小,把5放到A点,此时,G点就空出来了,如下图。
你从后街拉一个人过来,你肯定也要从前街拉一个人到后街去填那个坑。那我们就从前街找一个大于等于8的放到G点,D点就是我们要找的,把31放到G点。
重复进行轮回,从后街拉一个到前街,再从前街拉一个到后街。直到从前街来的和从后街来的相碰,碰撞点就把x值存放的位置。因为我们一直以x值作为参考点,所以左边(前街)的都是小于X的,右边(后街)的都是大于等于X
java代码实现,建议代码看完还要自己敲,这里涉及的逻辑有很多,可以很好的锻炼自己的逻辑能力。
package net.evecom;
/**
* Created by 76549 on 2019-05-15.
*/
public class Sort {
public static void quickSort(int[] arr, int begin, int end) {
//递归退出的条件
if (begin < end) {
//x为临时存放值
int x = arr[begin];
int i = begin;
int j = end;
while (i < j) {
//需要找到一个小于x的时候,退出当前j--循环
while (i < j && x <= arr[j]) {
j--;
}
if (i < j) {
arr[i] = arr[j];
i++;
}
//需要找到一个大于等于x的时候,退出当前i++循环
while (i < j && x > arr[i]) {
i++;
}
if (i < j) {
arr[j] = arr[i];
j--;
}
}
arr[i] = x;
quickSort(arr, begin, i - 1);
quickSort(arr, i + 1, end);
}
}
public static void main(String[] args) {
int[] arr = new int[]{8, 1, 2, 31, 33, 33, 5, 9};
quickSort(arr, 0, arr.length - 1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
得到的结果