Skip to content

Commit 6b2c38c

Browse files
authored
[cpp] Stick with swap (#1474)
* [cpp] Stick with swap * [cpp] Stick with swap
1 parent f4baa7d commit 6b2c38c

File tree

1 file changed

+16
-37
lines changed

1 file changed

+16
-37
lines changed

codes/cpp/chapter_sorting/quick_sort.cpp

+16-37
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,19 @@
99
/* 快速排序类 */
1010
class QuickSort {
1111
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-
1912
/* 哨兵划分 */
2013
static int partition(vector<int> &nums, int left, int right) {
2114
// 以 nums[left] 为基准数
2215
int i = left, j = right;
2316
while (i < j) {
2417
while (i < j && nums[j] >= nums[left])
25-
j--; // 从右向左找首个小于基准数的元素
18+
j--; // 从右向左找首个小于基准数的元素
2619
while (i < j && nums[i] <= nums[left])
27-
i++; // 从左向右找首个大于基准数的元素
28-
swap(nums, i, j); // 交换这两个元素
20+
i++; // 从左向右找首个大于基准数的元素
21+
swap(nums[i], nums[j]); // 交换这两个元素
2922
}
30-
swap(nums, i, left); // 将基准数交换至两子数组的分界线
31-
return i; // 返回基准数的索引
23+
swap(nums[i], nums[left]); // 将基准数交换至两子数组的分界线
24+
return i; // 返回基准数的索引
3225
}
3326

3427
public:
@@ -48,13 +41,6 @@ class QuickSort {
4841
/* 快速排序类(中位基准数优化) */
4942
class QuickSortMedian {
5043
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-
5844
/* 选取三个候选元素的中位数 */
5945
static int medianThree(vector<int> &nums, int left, int mid, int right) {
6046
int l = nums[left], m = nums[mid], r = nums[right];
@@ -70,18 +56,18 @@ class QuickSortMedian {
7056
// 选取三个候选元素的中位数
7157
int med = medianThree(nums, left, (left + right) / 2, right);
7258
// 将中位数交换至数组最左端
73-
swap(nums, left, med);
59+
swap(nums[left], nums[med]);
7460
// 以 nums[left] 为基准数
7561
int i = left, j = right;
7662
while (i < j) {
7763
while (i < j && nums[j] >= nums[left])
78-
j--; // 从右向左找首个小于基准数的元素
64+
j--; // 从右向左找首个小于基准数的元素
7965
while (i < j && nums[i] <= nums[left])
80-
i++; // 从左向右找首个大于基准数的元素
81-
swap(nums, i, j); // 交换这两个元素
66+
i++; // 从左向右找首个大于基准数的元素
67+
swap(nums[i], nums[j]); // 交换这两个元素
8268
}
83-
swap(nums, i, left); // 将基准数交换至两子数组的分界线
84-
return i; // 返回基准数的索引
69+
swap(nums[i], nums[left]); // 将基准数交换至两子数组的分界线
70+
return i; // 返回基准数的索引
8571
}
8672

8773
public:
@@ -101,26 +87,19 @@ class QuickSortMedian {
10187
/* 快速排序类(尾递归优化) */
10288
class QuickSortTailCall {
10389
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-
11190
/* 哨兵划分 */
11291
static int partition(vector<int> &nums, int left, int right) {
11392
// 以 nums[left] 为基准数
11493
int i = left, j = right;
11594
while (i < j) {
11695
while (i < j && nums[j] >= nums[left])
117-
j--; // 从右向左找首个小于基准数的元素
96+
j--; // 从右向左找首个小于基准数的元素
11897
while (i < j && nums[i] <= nums[left])
119-
i++; // 从左向右找首个大于基准数的元素
120-
swap(nums, i, j); // 交换这两个元素
98+
i++; // 从左向右找首个大于基准数的元素
99+
swap(nums[i], nums[j]); // 交换这两个元素
121100
}
122-
swap(nums, i, left); // 将基准数交换至两子数组的分界线
123-
return i; // 返回基准数的索引
101+
swap(nums[i], nums[left]); // 将基准数交换至两子数组的分界线
102+
return i; // 返回基准数的索引
124103
}
125104

126105
public:

0 commit comments

Comments
 (0)