Skip to content

Commit daf3932

Browse files
authored
up QuickSort and MergeSort by vector
1 parent 88e6b71 commit daf3932

File tree

1 file changed

+39
-12
lines changed

1 file changed

+39
-12
lines changed

algorithms/algo_notes/BAT 常见十大排序算法整理初稿.md

+39-12
Original file line numberDiff line numberDiff line change
@@ -186,18 +186,19 @@ int main() {
186186

187187
另一个写法
188188
```C++
189-
void QuickSort(std::vector<int> &nums,int l,int r) {
190-
if (l + 1 >= r) return;
191-
int first = l, last = r - 1 ,piv = nums[first];
192-
while (first < last) {
193-
while (first < last && nums[last] >= piv) last--;//右指针 从右向左扫描 将小于piv的放到左边
194-
nums[first] = nums[last];
195-
while (first < last && nums[first] <= piv) first++;//左指针 从左向右扫描 将大于piv的放到右边
196-
nums[last] = nums[first];
197-
}
198-
nums[first] = piv;//更新piv
199-
quick_sort(nums, l, first);//递归排序
200-
quick_sort(nums, first + 1, r);
189+
void QuickSort(std::vector<int>& a, int left, int right) {
190+
if (left >= right) return;
191+
int piv = a[left];
192+
int l = left, r = right;
193+
while (l < r) {
194+
while(l < r && a[r] >= piv) --r;//从右向左找到第一个小于x的 将小于piv的放到左边
195+
if (l < r) a[l++] = a[r];
196+
while (l < r && a[l] <= piv) ++l;//从左向右找第一个大于x的数 将大于piv的放到右边
197+
if (l < r) a[r--] = a[l];
198+
}
199+
a[l] = piv;//更新piv
200+
quickSort(a, left, l - 1);//递归排序
201+
quickSort(a, l + 1, right);
201202
}
202203
```
203204
@@ -247,6 +248,32 @@ void mergeSort(int a[],int L,int R) {
247248
}
248249
```
249250

251+
另一种写法
252+
```c++
253+
void mergeCount(std::vector<int>& a, int left, int mid, int right) {
254+
std::vector<int>tmp(left+mid+right, 0);
255+
int i = left;
256+
int j = mid + 1;
257+
int k = 0;
258+
while (i <= mid && j <= right) {
259+
if (a[i] < a[j]) tmp[k++] = a[i++];
260+
else tmp[k++] = a[j++];
261+
}
262+
while (i <= mid) tmp[k++] = a[i++];
263+
while (j <= right) tmp[k++] = a[j++];
264+
for (int p = 0; p < k; ++p) {
265+
a[left + p] = tmp[p];
266+
}
267+
}
268+
void mergeSort(std::vector<int>& a, int left, int right) {
269+
if (left >= right) return;
270+
int mid = left + (right - left) / 2;
271+
mergeSort(a, left, mid);
272+
mergeSort(a, mid + 1, right);
273+
mergeCount(a, left, mid, right);
274+
}
275+
```
276+
250277
测试
251278
252279
```c++

0 commit comments

Comments
 (0)