纯c实现:
#include<stdio.h>
void mergearray(int*a, int first, int mid, int last, int*temp)
{
int i = first, j = mid+1, k = last,m=0;
while (i <= mid&&j <= last) {
if (a[i] < a[j])
temp[++m] = a[i++];
else
temp[++m] = a[j++];
}
while (i <= mid)
temp[++m] = a[i++];
while (j <= last)
temp[++m] = a[j++];
for (i = 1; i <= m; i++)
a[first+i-1] = temp[i];
}
void mergesort(int*a, int first, int last, int*temp)
{
if (first < last) {
int mid = (first + last) / 2;
mergesort(a, first, mid, temp);
mergesort(a, mid + 1, last, temp);
mergearray(a, first, mid, last, temp);
}
}
int main(void)
{
int n, i, j, num[10000], temp[10000];
scanf("%d", &n);
for (i = 1; i <= n; i++)
scanf("%d", &num[i]);
mergesort(num, 1, n, temp);
for (i = 1; i <= n; i++)
printf("%d ", num[i]);
puts("");
return 0;
}
利用c++库简化:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int num[10000], temp[10000];
void mergearray( int first, int mid, int last)
{
merge(num + first, num + mid + 1, num + mid + 1, num + last + 1, temp + first);
for (; first <= last; first++)
num[first] = temp[first];
}
void mergesort( int first, int last)
{
if (first < last) {
int mid = (first + last) / 2;
mergesort(first, mid);
mergesort(mid + 1, last);
mergearray(first, mid, last);
}
}
int main(void)
{
int n, i, j;
scanf("%d", &n);
for (i = 1; i <= n; i++)
scanf("%d", &num[i]);
mergesort( 1, n);
for (i = 1; i <= n; i++)
printf("%d ", num[i]);
puts("");
return 0;
}