#include
#include
#include
void Merge(int *a, int *tmp, int lpos, int rpos, int rightend) {
int original_lpos = lpos; // 保存原始左起始位置
int leftend = rpos - 1;
int tmppos = original_lpos;
while (lpos <= leftend && rpos <= rightend) {
if (a[lpos] <= a[rpos]) {
tmp[tmppos++] = a[lpos++];
} else {
tmp[tmppos++] = a[rpos++];
}
}
while (lpos <= leftend) {
tmp[tmppos++] = a[lpos++];
}
while (rpos <= rightend) {
tmp[tmppos++] = a[rpos++];
}
// 将合并后的数据复制回原数组
for (int i = original_lpos; i <= rightend; i++) {
a[i] = tmp[i];
}
}
void MSort(int *a, int *tmp, int left, int right) {
if (left == right) return;
int mid = (left + right) / 2;
MSort(a, tmp, left, mid);
MSort(a, tmp, mid + 1, right);
Merge(a, tmp, left, mid + 1, right);
}
int main() {
int n;
scanf("%d", &n);
int *a = (int *)malloc(n * sizeof(int));
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
int *tmp = (int *)malloc(n * sizeof(int));
MSort(a, tmp, 0, n - 1);
for (int i = 0; i < n; i++) {
printf("%d ", a[i]); // 输出原数组a
}
free(a);
free(tmp);
system("pause");
return 0;
}
//说实话,刚开始一直不理解究竟怎么把原数组进行所谓的分割这一过程,看代码递归也想了好一会,于2025年3月11日晚22点初窥天门,所谓的分割,就是通过不断递归使得递归函数的参数不断变化,例如上述代码待分数组的左下标与右下标,待递归深度最大时,开始不断归并,再联系此时参数便能不断操作相应下标范围内的数组,那这不就已经分出来数组并开始归并了吗。