快速排序

算法描述

  • 挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),
  • 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这- 个分割结束之后,对基准值的排序就已经完成,
  • 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。

代码实现

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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
/**
* 快速排序(非递归版)
*/
private static void quickSortByNotRecursive(int[] arr) {
Stack<Integer> stack = new Stack<>();
stack.push(arr.length - 1);
stack.push(0);

while (!stack.isEmpty()) {
Integer newStart = stack.pop();
Integer newEnd = stack.pop();

int partition = partition(arr, newStart, newEnd);
if (newStart < partition - 1) {
stack.push(partition - 1);
stack.push(newStart);
}
if (partition + 1 < newEnd) {
stack.push(newEnd);
stack.push(partition + 1);
}
}
}

/**
* 快速排序(递归版)
*/
private static void quickSortByRecursive(int[] arr, int start, int end) {
if (start >= end) {
return;
}

int partIndex = partition(arr, start, end);

quickSortByRecursive(arr, start, partIndex - 1);
quickSortByRecursive(arr, partIndex + 1, end);
}

/**
* 分区算法
*/
private static int partition(int[] arr, int start, int end) {
if (start < end) {
int pivot = arr[start];
while (start < end) {
while (start < end && arr[end] >= pivot) end--;
arr[start] = arr[end];
while (start < end && arr[start] <= pivot) start++;
arr[end] = arr[start];
}

arr[start] = pivot;
}
return start;
}

动图演示