9
9
/* 快速排序类 */
10
10
class QuickSort {
11
11
private:
12
- /* 元素交换 */
13
- static void swap (vector<int > &nums, int i, int j) {
14
- int tmp = nums[i];
15
- nums[i] = nums[j];
16
- nums[j] = tmp;
17
- }
18
-
19
12
/* 哨兵划分 */
20
13
static int partition (vector<int > &nums, int left, int right) {
21
14
// 以 nums[left] 为基准数
22
15
int i = left, j = right;
23
16
while (i < j) {
24
17
while (i < j && nums[j] >= nums[left])
25
- j--; // 从右向左找首个小于基准数的元素
18
+ j--; // 从右向左找首个小于基准数的元素
26
19
while (i < j && nums[i] <= nums[left])
27
- i++; // 从左向右找首个大于基准数的元素
28
- swap (nums, i, j ); // 交换这两个元素
20
+ i++; // 从左向右找首个大于基准数的元素
21
+ swap (nums[i], nums[j] ); // 交换这两个元素
29
22
}
30
- swap (nums, i, left); // 将基准数交换至两子数组的分界线
31
- return i; // 返回基准数的索引
23
+ swap (nums[i], nums[ left]); // 将基准数交换至两子数组的分界线
24
+ return i; // 返回基准数的索引
32
25
}
33
26
34
27
public:
@@ -48,13 +41,6 @@ class QuickSort {
48
41
/* 快速排序类(中位基准数优化) */
49
42
class QuickSortMedian {
50
43
private:
51
- /* 元素交换 */
52
- static void swap (vector<int > &nums, int i, int j) {
53
- int tmp = nums[i];
54
- nums[i] = nums[j];
55
- nums[j] = tmp;
56
- }
57
-
58
44
/* 选取三个候选元素的中位数 */
59
45
static int medianThree (vector<int > &nums, int left, int mid, int right) {
60
46
int l = nums[left], m = nums[mid], r = nums[right];
@@ -70,18 +56,18 @@ class QuickSortMedian {
70
56
// 选取三个候选元素的中位数
71
57
int med = medianThree (nums, left, (left + right) / 2 , right);
72
58
// 将中位数交换至数组最左端
73
- swap (nums, left, med);
59
+ swap (nums[ left], nums[ med] );
74
60
// 以 nums[left] 为基准数
75
61
int i = left, j = right;
76
62
while (i < j) {
77
63
while (i < j && nums[j] >= nums[left])
78
- j--; // 从右向左找首个小于基准数的元素
64
+ j--; // 从右向左找首个小于基准数的元素
79
65
while (i < j && nums[i] <= nums[left])
80
- i++; // 从左向右找首个大于基准数的元素
81
- swap (nums, i, j ); // 交换这两个元素
66
+ i++; // 从左向右找首个大于基准数的元素
67
+ swap (nums[i], nums[j] ); // 交换这两个元素
82
68
}
83
- swap (nums, i, left); // 将基准数交换至两子数组的分界线
84
- return i; // 返回基准数的索引
69
+ swap (nums[i], nums[ left]); // 将基准数交换至两子数组的分界线
70
+ return i; // 返回基准数的索引
85
71
}
86
72
87
73
public:
@@ -101,26 +87,19 @@ class QuickSortMedian {
101
87
/* 快速排序类(尾递归优化) */
102
88
class QuickSortTailCall {
103
89
private:
104
- /* 元素交换 */
105
- static void swap (vector<int > &nums, int i, int j) {
106
- int tmp = nums[i];
107
- nums[i] = nums[j];
108
- nums[j] = tmp;
109
- }
110
-
111
90
/* 哨兵划分 */
112
91
static int partition (vector<int > &nums, int left, int right) {
113
92
// 以 nums[left] 为基准数
114
93
int i = left, j = right;
115
94
while (i < j) {
116
95
while (i < j && nums[j] >= nums[left])
117
- j--; // 从右向左找首个小于基准数的元素
96
+ j--; // 从右向左找首个小于基准数的元素
118
97
while (i < j && nums[i] <= nums[left])
119
- i++; // 从左向右找首个大于基准数的元素
120
- swap (nums, i, j ); // 交换这两个元素
98
+ i++; // 从左向右找首个大于基准数的元素
99
+ swap (nums[i], nums[j] ); // 交换这两个元素
121
100
}
122
- swap (nums, i, left); // 将基准数交换至两子数组的分界线
123
- return i; // 返回基准数的索引
101
+ swap (nums[i], nums[ left]); // 将基准数交换至两子数组的分界线
102
+ return i; // 返回基准数的索引
124
103
}
125
104
126
105
public:
0 commit comments