题目:
对n个元素组成的序列进行排序。
基本思想:将待排序元素分成大小大致相同的两个子集合,分别对两个集合进行排序,最终将排序好的子集合合并成所要求的排好序的集合。
代码:
#include <bits/stdc++.h>
using namespace std;
void Copy(int *a,int *b,int left,int right)
{
for(int i=left; i<=right; i++)
a[i]=b[i];
}
void Merge(int *a,int *b,int left,int mid,int right)
{
int i=left,j=mid+1,k=left;//a[left:mid] && a[mid+1:right] --> b[left:right]
while(i<=mid&&j<=right)
{
if(a[i]<=a[j])
b[k++]=a[i++];
else
b[k++]=a[j++];
}
if(i<=mid)
for(int q=i; q<=mid; q++)
b[k++]=a[q];
else
for(int q=j; q<=right; q++)
b[k++]=a[q];
}
void MergeSort(int *a, int left, int right)
{
int i;
int b[100];
if(left<right) //至少有2个元素
{
i=(left+right)/2; //取中点
MergeSort(a,left,i);
MergeSort(a,i+1,right);
Merge(a,b,left,i,right); //合并到数组b
Copy(a,b,left,right); //复制回数组a
}
}
int main()
{
int n;
int a[100];
while(~scanf("%d",&n))
{
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("\n");
}
return 0;
}