算法习题03:快速排序

算法图解:快速排序

截图来自《算法图解》这本书

代码实现:

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 class QuickUtil {

public static int[] quickSort(int[] ints, int start, int end){
if (start > end){
return ints;
}
//基点,第一个数
int pivot = ints[start];
//左指针
int left = start;
int right = end;
while (left < right){
while (ints[right] >= pivot && left < right){
right --;
}
while (ints[left] <= pivot && left < right){
left ++;
}
if (left < right){
int temp = ints[right];
ints[right] = ints[left];
ints[left] = temp;
}
}
ints[start] = ints[left];
ints[left] = pivot;
quickSort(ints, start, left -1);
quickSort(ints, left + 1, end);
return ints;
}

public static void main(String[] args) {
int[] arr = {81, 65, 17, 1, 71, 9, 26, 12, 93, 30, 55};
int[] ints = quickSort(arr, 0, arr.length - 1);
System.out.println(JSON.toJSONString(ints));
}
}

过程讲解:

选出基准值,可以随意选择,但一般会选择最后一个数或者第一个数作为基准值。

这里选择第一个数作为基准值。

指定两个指针,left和right,left从左边开始寻找,right从右边开始寻找。

left找出一个比基准值大的值停止寻找。

right找出一个比基准值小的值停止寻找。

然后两个值进行交换。(93和55交换)

继续往下寻找。。

当left和right相等时,left(right)对应值与基准值进行交换。

以81为分界线,分为两段继续进行排序。

第一段的开始值为start 和 left-1(或right-1)

第一段的开始值为left+1(或right+1)和 end

(此时left为它与right相等时的下表,这个下标的值与基准值交换后,就是基准值了,基准值左边的是比自己小的,右边是比自己大的)

使用递归,第一段和第二段继续排序。

……

-------------本文结束感谢您的阅读-------------