#include <iostream>
// 包含STL库,通常不推荐这样使用,最好是包含需要的特定库
#include <bits/stdc++.h>
using namespace std;
// Merge函数用于合并两个已排序的数组B和C到数组A
void Merge(int B[], int C[], int A[], int p, int q) {
int i = 0, j = 0, k = 0;
// 遍历B和C数组,将较小的元素依次添加到A中
while (i < p && j < q) {
if (B[i] < C[j]) {
A[k] = B[i];
i++;
} else {
A[k] = C[j];
j++;
}
k++;
}
// 如果B数组还有剩余,将剩余部分复制到A中
if (i == p) {
while (j < q) {
A[k] = C[j];
j++;
k++;
}
// 如果C数组还有剩余,将剩余部分复制到A中
} else if (j == q) {
while (i < p) {
A[k] = B[i];
i++;
k++;
}
}
}
// Mergesort函数实现归并排序
void Mergesort(int A[], int len) {
// 递归的基本情况,如果数组长度大于1则继续分解
if (len > 1) {
int mid = len / 2; // 找到中间位置
int B[mid]; // 创建左半边数组
int C[len - mid]; // 创建右半边数组
// 分别将A数组的左半边和右半边复制到B和C中
int j = 0;
for (int i = 0; i < mid; i++) B[i] = A[i];
for (int i = mid; i < len; i++) {
C[j] = A[i];
j++;
}
// 递归地对B和C进行归并排序
Mergesort(B, mid);
Mergesort(C, len - mid);
// 合并已排序的B和C到A数组
Merge(B, C, A, mid, len - mid);
}
}
int main() {
int len;
cin >> len; // 输入数组长度
int A[len]; // 创建数组
for (int i = 0; i < len; i++) cin >> A[i]; // 输入数组元素
Mergesort(A, len); // 对数组进行归并排序
// 打印排序后的数组
for (int i = 0; i < len; i++) {
// 每10个数字输出后换行
if ((i + 1) % 10 == 0) {
printf("%d\n", A[i]);
} else {
// 如果是数组的最后一个元素,则输出后换行
if (i == len - 1) {
printf("%d\n", A[i]);
} else {
// 否则,输出后加两个空格
printf("%d ", A[i]);
}
}
}
return 0;
}
C++实现归并(合并)排序,详细注释
于 2023-12-28 03:37:57 首次发布