/*
用zstu3539题目来验证算法的正确性
*/
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000000 + 10;
const int INF = 0x3f3f3f3f;
int a[maxn];
int L[maxn/2+10], R[maxn/2+10];
void Merge(int *a, int p, int q, int r)
{
int n1 = q - p + 1;
int n2 = r - q;
int i, j;
for (i=1; i<=n1; ++i)
{
L[i] = a[p+i-1];
}
for (j=1; j<=n2; ++j)
{
R[j] = a[q+j];
}
L[n1+1] = R[n2+1] = INF;
i = j = 1;
for (int k=p; k<=r; ++k)
{
a[k] = (L[i] < R[j]) ? L[i++] : R[j++];
}
}
void MergeSort(int *a, int p, int r)
{
if (p < r)
{
int q = p + (r - p) / 2;
MergeSort (a, p, q);
MergeSort (a, q + 1, r);
Merge (a, p, q, r);
}
}
int main(void)
{
//freopen ("rand_small.in", "r", stdin);
int n;
while (scanf ("%d", &n) != EOF)
{
for (int i=1; i<=n; ++i)
{
scanf ("%d", &a[i]);
}
MergeSort (a, 1, n);
for (int i=1; i<n; ++i)
{
printf ("%d ", a[i]);
}
printf ("%d", a[n]);
puts ("");
}
return 0;
}
排序算法之归并排序
最新推荐文章于 2024-08-08 18:23:38 发布