|
3 | 3 | import java.util.Arrays; |
4 | 4 |
|
5 | 5 | /** |
6 | | - * Title: 交换排序中的快速排序,目前应用最为广泛的排序算法,是一个递归算法 |
7 | | - * Description:快速排序包括两个过程:划分 和 快排 |
8 | | - * "划分"是指将原序列按基准元素划分两个子序列 |
9 | | - * "快排"是指分别对子序列进行快排 |
| 6 | + * Title: 交换排序中的快速排序,目前应用最为广泛的排序算法,是一个递归算法 |
| 7 | + * Description:快速排序包括两个过程:划分 和 快排 |
| 8 | + * "划分"是指将原序列按基准元素划分两个子序列 |
| 9 | + * "快排"是指分别对子序列进行快排 |
10 | 10 | * |
11 | | - * 就平均计算时间而言,快速排序是所有内部排序方法中最好的一个 |
| 11 | + * 就平均计算时间而言,快速排序是所有内部排序方法中最好的一个 |
12 | 12 | * |
13 | | - * 对大规模数据排序时,快排是快的;对小规模数据排序时,快排是慢的,甚至慢于简单选择排序等简单排序方法 |
| 13 | + * 对大规模数据排序时,快排是快的;对小规模数据排序时,快排是慢的,甚至慢于简单选择排序等简单排序方法 |
14 | 14 | * |
15 | | - * 快速排序依赖于原始序列,因此其时间复杂度从O(nlgn)到O(n^2)不等 |
16 | | - * 时间复杂度:最好情形O(nlgn),平均情形O(nlgn),最差情形O(n^2) |
| 15 | + * 快速排序依赖于原始序列,因此其时间复杂度从O(nlgn)到O(n^2)不等 |
| 16 | + * 时间复杂度:最好情形O(nlgn),平均情形O(nlgn),最差情形O(n^2) |
17 | 17 | * |
18 | | - * 递归所消耗的栈空间 |
19 | | - * 空间复杂度:O(lgn) |
| 18 | + * 递归所消耗的栈空间 |
| 19 | + * 空间复杂度:O(lgn) |
20 | 20 | * |
21 | | - * 可选任一元素作为基准元素 |
22 | | - * 稳 定 性:不稳定 |
| 21 | + * 可选任一元素作为基准元素 |
| 22 | + * 稳 定 性:不稳定 |
23 | 23 | * |
24 | 24 | * |
25 | | - * 内部排序(在排序过程中数据元素完全在内存) |
| 25 | + * 内部排序(在排序过程中数据元素完全在内存) |
26 | 26 | * |
27 | 27 | * @author rico |
28 | | - * @created 2017年5月20日 上午10:40:00 |
| 28 | + * @created 2017年5月20日 上午10:40:00 |
29 | 29 | */ |
30 | 30 | public class QuickSort { |
31 | 31 |
|
32 | 32 | /** |
33 | | - * @description 快排算法(递归算法):在递去过程中就把问题解决了 |
| 33 | + * @description 快排算法(递归算法):在递去过程中就把问题解决了 |
34 | 34 | * @author rico |
35 | | - * @created 2017年5月20日 下午5:12:06 |
| 35 | + * @created 2017年5月20日 下午5:12:06 |
36 | 36 | * @param target |
37 | 37 | * @param left |
38 | 38 | * @param right |
39 | 39 | * @return |
40 | 40 | */ |
41 | 41 | public static int[] quickSort(int[] target, int left, int right) { |
42 | | - |
43 | | - if(right > left){ // 递归终止条件 |
44 | | - int base_index = partition(target,left, right); // 原序列划分后基准元素的位置 |
45 | | - quickSort(target, left, base_index-1); // 对第一个子序列快速排序,不包含基准元素! |
46 | | - quickSort(target, base_index+1, right); // 对第二个子序列快速排序,不包含基准元素! |
47 | | - return target; |
| 42 | + if(right > left){ // 递归终止条件 |
| 43 | + int base_index = partition(target,left, right); // 原序列划分后基准元素的位置 |
| 44 | + quickSort(target, left, base_index-1); // 对第一个子序列快速排序,不包含基准元素! |
| 45 | + quickSort(target, base_index+1, right); // 对第二个子序列快速排序,不包含基准元素! |
48 | 46 | } |
49 | 47 | return target; |
50 | 48 | } |
51 | 49 |
|
52 | 50 |
|
53 | 51 | /** |
54 | | - * @description 序列划分,以第一个元素为基准元素 |
| 52 | + * @description 序列划分,以第一个元素为基准元素 |
55 | 53 | * @author rico |
56 | | - * @created 2017年5月20日 下午5:10:54 |
57 | | - * @param target 序列 |
58 | | - * @param left 序列左端 |
59 | | - * @param right 序列右端 |
| 54 | + * @created 2017年5月20日 下午5:10:54 |
| 55 | + * @param target 序列 |
| 56 | + * @param left 序列左端 |
| 57 | + * @param right 序列右端 |
60 | 58 | * @return |
61 | 59 | */ |
62 | 60 | public static int partition(int[] target, int left, int right){ |
63 | 61 |
|
64 | | - int base = target[left]; // 基准元素的值 |
65 | | - int base_index = left; // 基准元素最终应该在的位置 |
| 62 | + int base = target[left]; // 基准元素的值 |
| 63 | + int base_index = left; // 基准元素最终应该在的位置 |
66 | 64 |
|
67 | | - for (int i = left+1; i <= right; i++) { // 从基准元素的下一个元素开始 |
68 | | - if(target[i] < base){ // 若其小于基准元素 |
69 | | - base_index++; // 若其小于基准元素,则基准元素最终位置后移;否则不用移动 |
70 | | - if(base_index != i){ // 相等情况意味着i之前的元素都小于base,只需要换一次即可,不需要次次都换 |
| 65 | + for (int i = left+1; i <= right; i++) { // 从基准元素的下一个元素开始 |
| 66 | + if(target[i] < base){ // 若其小于基准元素 |
| 67 | + base_index++; // 若其小于基准元素,则基准元素最终位置后移;否则不用移动 |
| 68 | + if(base_index != i){ // 相等情况意味着i之前的元素都小于base,只需要换一次即可,不需要次次都换 |
71 | 69 | int temp = target[base_index]; |
72 | 70 | target[base_index] = target[i]; |
73 | 71 | target[i] = temp; |
74 | 72 | } |
75 | 73 | } |
76 | 74 | } |
77 | 75 |
|
78 | | - // 将基准元素就位 |
| 76 | + // 将基准元素就位 |
79 | 77 | target[left] = target[base_index]; |
80 | 78 | target[base_index] = base; |
81 | 79 |
|
82 | 80 | System.out.println(Arrays.toString(target)); |
83 | 81 |
|
84 | | - return base_index; //返回划分后基准元素的位置 |
| 82 | + return base_index; //返回划分后基准元素的位置 |
85 | 83 | } |
86 | 84 | } |
0 commit comments