-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMergeSort.c
More file actions
40 lines (35 loc) · 1.07 KB
/
Copy pathMergeSort.c
File metadata and controls
40 lines (35 loc) · 1.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//
// MergeSort.c
// AlgorithmForC
//
// Created by gjh on 2021/2/1.
//
#include "MergeSort.h"
// 912.排序数组 必须掌握 归并排序
void merge(int* arr, int leftPtr, int rightPtr, int rightBound) {
// 中间值
int mid = rightPtr - 1;
int* temp = (int*)malloc(sizeof(int) * (rightBound - leftPtr + 1));
// 定义三个指针
int i = leftPtr, j = rightPtr, k = 0;
while (i <= mid && j <= rightBound) {
temp[k++] = arr[i] <= arr[j] ? arr[i++] : arr[j++];
}
// 处理 i 或者 j 提前结束
while (i <= mid) temp[k++] = arr[i++]; // i 还有值
while (j <= rightBound) temp[k++] = arr[j++]; // j 还有值
// 将 temp 赋值给 arr
for (int m = 0; m < (rightBound - leftPtr + 1); m++) {
arr[leftPtr + m] = temp[m];
}
}
void sort(int* arr, int left, int right) {
if (left == right) return;
// 分成两半
int mid = left + ((right - left) >> 1);
// 左边排序
sort(arr, left, mid);
// 右边排序
sort(arr, mid + 1, right);
merge(arr, left, mid + 1, right);
}