From 6b2c38cae4e75f88845734dbf3a21bfcb4f614b8 Mon Sep 17 00:00:00 2001 From: ZhongYuuu <98929663+ZhongYuuu@users.noreply.github.com> Date: Tue, 6 Aug 2024 15:08:01 +0800 Subject: [PATCH] [cpp] Stick with swap (#1474) * [cpp] Stick with swap * [cpp] Stick with swap --- codes/cpp/chapter_sorting/quick_sort.cpp | 53 +++++++----------------- 1 file changed, 16 insertions(+), 37 deletions(-) diff --git a/codes/cpp/chapter_sorting/quick_sort.cpp b/codes/cpp/chapter_sorting/quick_sort.cpp index 9768fec8a..90d677542 100644 --- a/codes/cpp/chapter_sorting/quick_sort.cpp +++ b/codes/cpp/chapter_sorting/quick_sort.cpp @@ -9,26 +9,19 @@ /* 快速排序类 */ class QuickSort { private: - /* 元素交换 */ - static void swap(vector &nums, int i, int j) { - int tmp = nums[i]; - nums[i] = nums[j]; - nums[j] = tmp; - } - /* 哨兵划分 */ static int partition(vector &nums, int left, int right) { // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) - j--; // 从右向左找首个小于基准数的元素 + j--; // 从右向左找首个小于基准数的元素 while (i < j && nums[i] <= nums[left]) - i++; // 从左向右找首个大于基准数的元素 - swap(nums, i, j); // 交换这两个元素 + i++; // 从左向右找首个大于基准数的元素 + swap(nums[i], nums[j]); // 交换这两个元素 } - swap(nums, i, left); // 将基准数交换至两子数组的分界线 - return i; // 返回基准数的索引 + swap(nums[i], nums[left]); // 将基准数交换至两子数组的分界线 + return i; // 返回基准数的索引 } public: @@ -48,13 +41,6 @@ class QuickSort { /* 快速排序类(中位基准数优化) */ class QuickSortMedian { private: - /* 元素交换 */ - static void swap(vector &nums, int i, int j) { - int tmp = nums[i]; - nums[i] = nums[j]; - nums[j] = tmp; - } - /* 选取三个候选元素的中位数 */ static int medianThree(vector &nums, int left, int mid, int right) { int l = nums[left], m = nums[mid], r = nums[right]; @@ -70,18 +56,18 @@ class QuickSortMedian { // 选取三个候选元素的中位数 int med = medianThree(nums, left, (left + right) / 2, right); // 将中位数交换至数组最左端 - swap(nums, left, med); + swap(nums[left], nums[med]); // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) - j--; // 从右向左找首个小于基准数的元素 + j--; // 从右向左找首个小于基准数的元素 while (i < j && nums[i] <= nums[left]) - i++; // 从左向右找首个大于基准数的元素 - swap(nums, i, j); // 交换这两个元素 + i++; // 从左向右找首个大于基准数的元素 + swap(nums[i], nums[j]); // 交换这两个元素 } - swap(nums, i, left); // 将基准数交换至两子数组的分界线 - return i; // 返回基准数的索引 + swap(nums[i], nums[left]); // 将基准数交换至两子数组的分界线 + return i; // 返回基准数的索引 } public: @@ -101,26 +87,19 @@ class QuickSortMedian { /* 快速排序类(尾递归优化) */ class QuickSortTailCall { private: - /* 元素交换 */ - static void swap(vector &nums, int i, int j) { - int tmp = nums[i]; - nums[i] = nums[j]; - nums[j] = tmp; - } - /* 哨兵划分 */ static int partition(vector &nums, int left, int right) { // 以 nums[left] 为基准数 int i = left, j = right; while (i < j) { while (i < j && nums[j] >= nums[left]) - j--; // 从右向左找首个小于基准数的元素 + j--; // 从右向左找首个小于基准数的元素 while (i < j && nums[i] <= nums[left]) - i++; // 从左向右找首个大于基准数的元素 - swap(nums, i, j); // 交换这两个元素 + i++; // 从左向右找首个大于基准数的元素 + swap(nums[i], nums[j]); // 交换这两个元素 } - swap(nums, i, left); // 将基准数交换至两子数组的分界线 - return i; // 返回基准数的索引 + swap(nums[i], nums[left]); // 将基准数交换至两子数组的分界线 + return i; // 返回基准数的索引 } public: