基本介绍
快速排序(Quick Sort)使用分治法策略。它的基本思想是:选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
排序流程
- 从数列中挑出一个基准值。
- 将所有比基准值小的摆放在基准前面,所有比基准值大的摆在基准的后面(相同的数可以到任一边);在这个分区退出之后,该基准就处于数列的中间位置。
- 递归地把"基准值前面的子数列"和"基准值后面的子数列"进行排序。
快速排序一般有两种方法:第一种是挖坑法,第二种是前后指针法,第一种较常用。
代码实现(挖坑法)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
public static void quickSort(int[] arr) {
quickSort(arr, 0, arr.length - 1);
}
/**
* 快速排序 挖坑填数法
*
* @param arr
*/
public static void quickSort(int[] arr, int left, int right) {
if (left >= right) {
return;
}
int x = arr[left], i = left, j = right;
while (i < j) {
//从右到左找第一个比x小的数 填坑
while (arr[j] >= x && i < j) {
j--;
}
if (i < j) {
arr[i] = arr[j]; //将arr[j]填到arr[i]中,arr[j]就形成了一个新的坑
i++;
}
//从左到右找到第一个数比x大的数填最近出现的坑
while (arr[i] <= x && i < j) {
i++;
}
if (i < j) {
arr[j] = arr[i]; //将arr[i]填到arr[j]中,arr[i]就形成了一个新的坑
j--;
}
}
arr[i] = x;
quickSort(arr, left, i - 1); //递归调用
quickSort(arr, i + 1, right);
}
|