题目描述
这是一个很简单的排序题目. 为了锻炼大家对不同算法的了解,请大家用归并排序法对此题进行解答. 对一组整数数列A[1],A[2],A[3]......A[N]进行排序,按照从小到大的顺序输出.
输入
本题只有一组测试数据,在输入的第一行输入N(表示整数数列的大小)(N < 1000)
接下来N行输入N个整数,每一行一个整数.
输出
对已经排好序的数从小到大依次输出,每两个数之间用两个空格隔开,且每输出10个数换行.
样例
12
45
545
48
47
44
45
4857
58
57
485
1255
42
样例输出
42 44 45 45 47 48 57 58 485 545
1255 4857
代码
#include<cstdio>
#include<iostream>
using namespace std;
int A[1000],B[1000];
void merge(int *A, int start,int mid, int end){//归并
int i = start, j = mid + 1;
int k = i;
while( i <= mid && j <= end){
if(A[i] <= A[j]){
B[k++] = A[i++];
}
else B[k++] = A[j++];
}
if(i == mid + 1){
while(j <= end)
B[k++] = A[j++];
}
else if(j == end + 1)
{
while(i <= mid)
B[k++] = A[i++];
}
for(int i = start; i <= end; i++)
A[i] = B[i];
}
void merge_sort(int *A, int start, int end){//分治、一分为二
int mid = (start+end)/2;
if(start < end ){
merge_sort(A,start,mid);
merge_sort(A,mid + 1,end);
merge(A,start,mid,end);
}
}
int main(){
int n;
cin>>n;
for(int i = 0; i < n; i++){
cin>>A[i];
}
merge_sort(A,0,n-1);
for(int i = 0 ; i < n; i++){
cout<<A[i];
if((i + 1)%10==0 || i == n - 1)
cout<<endl;
else cout<<" ";//注意是两个空格
}
return 0;
}
思路
- 合并排序是成功应用分治技术的一个完美例子;
- 合并排序有较好的稳定性;
- 对于一个需要排序的数组A[0..n-1],合并排序把它一分为二:A[0..n/2-1] 和 A[n/2..n-1],并对每个子数组递归排序,然后把这两个排序好的子数组合并为一个有序数组。
- 图例: