From e1b1c66c569c4b9b5db7531b209382acad4922df Mon Sep 17 00:00:00 2001 From: shouao <792417939@qq.com> Date: Sat, 1 Jan 2022 06:34:55 +0800 Subject: [PATCH 1/8] add cplusplus version in shell-sort and merg-sort --- 4.shellSort.md | 20 ++++++++++++++++ 5.mergeSort.md | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) diff --git a/4.shellSort.md b/4.shellSort.md index cfa59f5..6f0bc7f 100644 --- a/4.shellSort.md +++ b/4.shellSort.md @@ -144,3 +144,23 @@ function shellSort($arr) return $arr; } ``` + +## 7. C++ 代码实现 + +```cpp +void shellSort(vector& nums) { + int gap = 1; + while (gap < (int)nums.size() / 3) { + gap = gap * 3 + 1; + } + for (; gap >= 1; gap /= 3) { + for (int i = 0; i < gap; ++i) { + for (int j = i + gap; j < nums.size(); j += gap) { + for (int k = j; k - gap >= 0 && nums[k] < nums[k - gap]; k -= gap) { + swap(nums[k], nums[k - gap]); + } + } + } + } +} +``` \ No newline at end of file diff --git a/5.mergeSort.md b/5.mergeSort.md index bf0de32..f49f547 100644 --- a/5.mergeSort.md +++ b/5.mergeSort.md @@ -222,4 +222,69 @@ function merge($left, $right) return $result; } +``` + +## 9. C++ 代码实现 + +### 9.1 递归版 + +```cpp +void mergeSort(vector& nums, int l, int r) { + if (r - l <= 1) { + return; + } + int mid = (l + r) / 2; + mergeSort(nums, l, mid); + mergeSort(nums, mid, r); + int index = 0; + int ptrL = l; + int ptrR = mid; + static vectortempary(50000); + while (ptrL != mid && ptrR != r) { + if (nums[ptrL] < nums[ptrR]) { + tempary[index++] = nums[ptrL++]; + } else { + tempary[index++] = nums[ptrR++]; + } + } + while (ptrL != mid) { + tempary[index++] = nums[ptrL++]; + } + while (ptrR != r) { + tempary[index++] = nums[ptrR++]; + } + copy(tempary.begin(), tempary.begin() + index, nums.begin() + l); +} +``` + +### 9.2 迭代版 + +```cpp +void mergeSort(vector& nums) { + for (int step = 1; step <= nums.size(); step *= 2) { + for (int i = 0; i + step < nums.size(); i += 2 * step) { + int l = i; + int r = min((int)nums.size(), i + step * 2); + int mid = i + step; + int index = 0; + int ptrL = l; + int ptrR = mid; + static vectortempary(50000); + while (ptrL != mid && ptrR != r) { + if (nums[ptrL] < nums[ptrR]) { + tempary[index++] = nums[ptrL++]; + } else { + tempary[index++] = nums[ptrR++]; + } + } + while (ptrL != mid) { + tempary[index++] = nums[ptrL++]; + } + while (ptrR != r) { + tempary[index++] = nums[ptrR++]; + } + copy(tempary.begin(), tempary.begin() + index, nums.begin() + l); + } + } +} ``` \ No newline at end of file From 3125abbfb3af6171f3746cd13422aebf139af7eb Mon Sep 17 00:00:00 2001 From: shouao <58040617+chenshouao@users.noreply.github.com> Date: Sat, 1 Jan 2022 06:42:15 +0800 Subject: [PATCH 2/8] Update 4.shellSort.md --- 4.shellSort.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/4.shellSort.md b/4.shellSort.md index 6f0bc7f..fca5e60 100644 --- a/4.shellSort.md +++ b/4.shellSort.md @@ -153,14 +153,15 @@ void shellSort(vector& nums) { while (gap < (int)nums.size() / 3) { gap = gap * 3 + 1; } - for (; gap >= 1; gap /= 3) { - for (int i = 0; i < gap; ++i) { - for (int j = i + gap; j < nums.size(); j += gap) { - for (int k = j; k - gap >= 0 && nums[k] < nums[k - gap]; k -= gap) { - swap(nums[k], nums[k - gap]); + for (; gap >= 1; gap /= 3) { + for (int i = 0; i < gap; ++i) { + for (int j = i + gap; j < nums.size(); j += gap) { + for (int k = j; k - gap >= 0 && nums[k] < nums[k - gap]; k -= gap) { + swap(nums[k], nums[k - gap]); } } } } } -``` \ No newline at end of file + +``` From 6773da4867c9c79fa3a108fca8bd511b6a342dfb Mon Sep 17 00:00:00 2001 From: shouao <58040617+chenshouao@users.noreply.github.com> Date: Sat, 1 Jan 2022 06:47:37 +0800 Subject: [PATCH 3/8] Update 5.mergeSort.md --- 5.mergeSort.md | 51 ++++++++++---------------------------------------- 1 file changed, 10 insertions(+), 41 deletions(-) diff --git a/5.mergeSort.md b/5.mergeSort.md index f49f547..c7b2622 100644 --- a/5.mergeSort.md +++ b/5.mergeSort.md @@ -226,16 +226,8 @@ function merge($left, $right) ## 9. C++ 代码实现 -### 9.1 递归版 - ```cpp -void mergeSort(vector& nums, int l, int r) { - if (r - l <= 1) { - return; - } - int mid = (l + r) / 2; - mergeSort(nums, l, mid); - mergeSort(nums, mid, r); +void merge(vector& nums, int l, int mid, int r) { int index = 0; int ptrL = l; int ptrR = mid; @@ -251,40 +243,17 @@ void mergeSort(vector& nums, int l, int r) { tempary[index++] = nums[ptrL++]; } while (ptrR != r) { - tempary[index++] = nums[ptrR++]; + tempary[index++] = nums[ptrR++]; } copy(tempary.begin(), tempary.begin() + index, nums.begin() + l); } -``` - -### 9.2 迭代版 - -```cpp -void mergeSort(vector& nums) { - for (int step = 1; step <= nums.size(); step *= 2) { - for (int i = 0; i + step < nums.size(); i += 2 * step) { - int l = i; - int r = min((int)nums.size(), i + step * 2); - int mid = i + step; - int index = 0; - int ptrL = l; - int ptrR = mid; - static vectortempary(50000); - while (ptrL != mid && ptrR != r) { - if (nums[ptrL] < nums[ptrR]) { - tempary[index++] = nums[ptrL++]; - } else { - tempary[index++] = nums[ptrR++]; - } - } - while (ptrL != mid) { - tempary[index++] = nums[ptrL++]; - } - while (ptrR != r) { - tempary[index++] = nums[ptrR++]; - } - copy(tempary.begin(), tempary.begin() + index, nums.begin() + l); - } +void mergeSort(vector& nums, int l, int r) { + if (r - l <= 1) { + return; } + int mid = (l + r) / 2; + mergeSort(nums, l, mid); + mergeSort(nums, mid, r); + merge(nums, l, mid, r); } -``` \ No newline at end of file +``` From 0c614a86da0d9e98395091e9173bcadb9283ec2c Mon Sep 17 00:00:00 2001 From: shouao <58040617+chenshouao@users.noreply.github.com> Date: Sat, 1 Jan 2022 06:57:11 +0800 Subject: [PATCH 4/8] Update 5.mergeSort.md --- 5.mergeSort.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/5.mergeSort.md b/5.mergeSort.md index c7b2622..c98680b 100644 --- a/5.mergeSort.md +++ b/5.mergeSort.md @@ -247,7 +247,7 @@ void merge(vector& nums, int l, int mid, int r) { } copy(tempary.begin(), tempary.begin() + index, nums.begin() + l); } -void mergeSort(vector& nums, int l, int r) { +void mergeSort(vector& nums, int l, int r) {// range is [l, r), so if there is a 0-index array arr whose length is n, "mergeSort(arr, 0, n)" should be called if (r - l <= 1) { return; } From f62636bede725aa4068b5ba3928d8d65392ee0e8 Mon Sep 17 00:00:00 2001 From: shouao <58040617+chenshouao@users.noreply.github.com> Date: Sat, 1 Jan 2022 06:59:10 +0800 Subject: [PATCH 5/8] Update 5.mergeSort.md --- 5.mergeSort.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/5.mergeSort.md b/5.mergeSort.md index c98680b..d28fb29 100644 --- a/5.mergeSort.md +++ b/5.mergeSort.md @@ -247,8 +247,8 @@ void merge(vector& nums, int l, int mid, int r) { } copy(tempary.begin(), tempary.begin() + index, nums.begin() + l); } -void mergeSort(vector& nums, int l, int r) {// range is [l, r), so if there is a 0-index array arr whose length is n, "mergeSort(arr, 0, n)" should be called - if (r - l <= 1) { +void mergeSort(vector& nums, int l, int r) {// sort the range [l, r), so if there is a 0-index array arr whose length is n + if (r - l <= 1) { //and you want sort the whole array, "mergeSort(arr, 0, n)" should be called return; } int mid = (l + r) / 2; From 4534fa5eff5ec2a11937c42358c1537b36dd60ae Mon Sep 17 00:00:00 2001 From: shouao <58040617+chenshouao@users.noreply.github.com> Date: Sat, 1 Jan 2022 07:04:15 +0800 Subject: [PATCH 6/8] Update 5.mergeSort.md --- 5.mergeSort.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/5.mergeSort.md b/5.mergeSort.md index d28fb29..e55b90c 100644 --- a/5.mergeSort.md +++ b/5.mergeSort.md @@ -231,7 +231,8 @@ void merge(vector& nums, int l, int mid, int r) { int index = 0; int ptrL = l; int ptrR = mid; - static vectortempary(50000); + static vectortempary; + tempary.resize(nums.size()); while (ptrL != mid && ptrR != r) { if (nums[ptrL] < nums[ptrR]) { tempary[index++] = nums[ptrL++]; From 1f7b01b699f921b36e9d02900a7243de3a1e22d5 Mon Sep 17 00:00:00 2001 From: shouao <58040617+chenshouao@users.noreply.github.com> Date: Sat, 1 Jan 2022 07:18:06 +0800 Subject: [PATCH 7/8] Update 5.mergeSort.md --- 5.mergeSort.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/5.mergeSort.md b/5.mergeSort.md index e55b90c..c030d8f 100644 --- a/5.mergeSort.md +++ b/5.mergeSort.md @@ -227,34 +227,36 @@ function merge($left, $right) ## 9. C++ 代码实现 ```cpp -void merge(vector& nums, int l, int mid, int r) { +void merge(vector& arr, int l, int mid, int r) { int index = 0; int ptrL = l; int ptrR = mid; static vectortempary; - tempary.resize(nums.size()); + if (arr.size() > tempary.size()) { + tempary.resize(arr.size()); + } while (ptrL != mid && ptrR != r) { - if (nums[ptrL] < nums[ptrR]) { - tempary[index++] = nums[ptrL++]; + if (arr[ptrL] < arr[ptrR]) { + tempary[index++] = arr[ptrL++]; } else { - tempary[index++] = nums[ptrR++]; + tempary[index++] = arr[ptrR++]; } } while (ptrL != mid) { - tempary[index++] = nums[ptrL++]; + tempary[index++] = arr[ptrL++]; } while (ptrR != r) { - tempary[index++] = nums[ptrR++]; + tempary[index++] = arr[ptrR++]; } - copy(tempary.begin(), tempary.begin() + index, nums.begin() + l); + copy(tempary.begin(), tempary.begin() + index, arr.begin() + l); } -void mergeSort(vector& nums, int l, int r) {// sort the range [l, r), so if there is a 0-index array arr whose length is n - if (r - l <= 1) { //and you want sort the whole array, "mergeSort(arr, 0, n)" should be called +void mergeSort(vector& arr, int l, int r) { // sort the range [l, r) in arr + if (r - l <= 1) { return; } int mid = (l + r) / 2; - mergeSort(nums, l, mid); - mergeSort(nums, mid, r); - merge(nums, l, mid, r); + mergeSort(arr, l, mid); + mergeSort(arr, mid, r); + merge(arr, l, mid, r); } ``` From 75cb7d6954aead08bb90d934e46655a8307d1d13 Mon Sep 17 00:00:00 2001 From: shouao <58040617+chenshouao@users.noreply.github.com> Date: Sat, 1 Jan 2022 07:19:37 +0800 Subject: [PATCH 8/8] Update 4.shellSort.md --- 4.shellSort.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/4.shellSort.md b/4.shellSort.md index fca5e60..858a78f 100644 --- a/4.shellSort.md +++ b/4.shellSort.md @@ -148,20 +148,19 @@ function shellSort($arr) ## 7. C++ 代码实现 ```cpp -void shellSort(vector& nums) { +void shellSort(vector& arr) { int gap = 1; - while (gap < (int)nums.size() / 3) { + while (gap < (int)arr.size() / 3) { gap = gap * 3 + 1; } for (; gap >= 1; gap /= 3) { for (int i = 0; i < gap; ++i) { - for (int j = i + gap; j < nums.size(); j += gap) { - for (int k = j; k - gap >= 0 && nums[k] < nums[k - gap]; k -= gap) { - swap(nums[k], nums[k - gap]); + for (int j = i + gap; j < arr.size(); j += gap) { + for (int k = j; k - gap >= 0 && arr[k] < arr[k - gap]; k -= gap) { + swap(arr[k], arr[k - gap]); } } } } } - ```