AcWing 787. 归并排序
原题链接
简单
// 归并排序
#include<iostream>
using namespace std;
const int N = 100010;
int a[N]; // 数据数组和排序数组
void merge(int A[], int L1, int R1, int L2, int R2) // 表示两个数组左右端点下标
{
int i = L1, j = L2;
int index = 0;
int temp[N];
while(i <= R1 && j <= R2) // 循环完后可能有其中一个数组还没选完
{
if(a[i] <= a[j]) temp[index++] = a[i++];
if(a[i] >= a[j]) temp[index++] = a[j++];
}
// 把剩下的数填进数组后面
while(i <= R1) temp[index++] = a[i++];
while(j <= R2) temp[index++] = a[j++];
for(int k = 0;k < index;k++)
a[L1 + k] = temp[k]; // 把temp数组赋给原数组对应的位置
}
void mergesort(int A[], int left,int right) // 左端点下标和右端点下标
{
if(left < right)
{
int mid = (left + right) / 2;
mergesort(a, left, mid);
mergesort(a, mid + 1, right);
merge(A, left, mid, mid + 1, right); // 合并两个序列并排序
}
}
int main()
{
int n;
cin >> n;
for(int i = 0;i < n;i++)
cin >> a[i];
mergesort(a, 0, n - 1);
for(int i = 0;i < n;i++)
printf("%d ",a[i]);
return 0;
}