描述
给定一个数列,用归并排序算法把它排成升序。
输入
第一行是一个整数n(n不大于10000),表示要排序的数的个数;
下面一行是用空格隔开的n个整数。
输出
输出排序后的数列,每个数字占一行。
输入样例
5
3 2 1 4 5
输出样例
1
2
3
4
5
基本思路:归并排序是将一组无序的数列,先一分为二,再将分过的继续一分为二……直到最后剩2个数字,然后将两个数字合并,然后将两个有序的两组数再合并……直到最后整个数列有序。其中关键的函数是merge()和mergesort()。代码如下,已经经过测试。
#include <iostream>
using namespace std;
int a[10001],b[10001],n; //b[]为辅助数组, 暂时储存要排序的部分数字
void mergesort(int low, int high);
void merge(int low, int mid, int high);
int main()
{
cin >> n;
for(int i = 0; i < n; i++)
{
cin >> a[i];
}
mergesort(0, n-1);
for(int i = 0; i < n; i++)
{
cout << a[i] << endl;
}
}
void mergesort(int low, int high)
{
int mid;
if(low < high) //表明最后是由两个数字先合并的;
{
mid = (low + high) / 2;
mergesort(low, mid);
mergesort(mid+1,high);
merge(low, mid, high);
}
}
void merge(int low, int mid, int high)
{
int i, j, k;
k = low;
i = low;
j = mid + 1;
while(i <= mid && j <= high)
{
if(a[i]<a[j])
b[k++] = a[i++];
else b[k++] = a[j++];
}
while (i <= mid)
{
b[k++] = a[i++];
}
while(j <= high)
{
b[k++] = a[j++];
}
for(i = low; i <= high; i++)
a[i] = b[i]; //要将已排好序的数组赋值给原数组,使原数组有序;
}