给定一维int型数组a[0,1,...,n-1], 使用归并排序方法, 对其进行从小到大排序。
归并排序划分请按a[0,mid=(0+n-1)/2], a[(0+n-1)/2+1, n-1]进行划分子问题.
Input
输入第1行有一个int型正整数m (m<100), 表示有m行输入.
每行输入的第一个数为int型正整数n (8<n<1000), 后面接着输入n个int型整数.
Output
输出m行, 每行为排好序的输出.
Sample Input
2
9 9 8 7 6 5 4 3 2 1
10 9 8 7 6 5 4 3 2 1 0
Sample Output
1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
//采用分治的思想,先分,后合
#include <iostream>
using namespace std;
void Mergesort(int a[],int start,int end);
int main()
{
int T, n;
cin >> T;
for (int i = 0; i < T; i++) {
cin >> n;
int* a = new int[n];
for (int i = 0; i < n; i++) {
cin >> a[i];
}
Mergesort(a, 0, n - 1);
for (int i = 0; i < n; i++) {
cout<< a[i]<<" ";
}
cout<<endl;
}
}
void Mergesort(int a[], int start, int end) {
if (start >= end) { return; } //递归终止条件
int mid = (start + end) / 2;
Mergesort(a, start, mid); //划分为两个子问题
Mergesort(a, mid + 1, end);
int* temp = new int[end - start + 1]; //建立一个暂存数组
int i = start, j = mid + 1; int k = 0; //分别指向两个子问题的头部
while (i <= mid && j <= end) {
if (a[i] <= a[j]) { temp[k] = a[i]; k++; i++; }
else if (a[j] < a[i]) { temp[k] = a[j]; k++; j++; }
}
while(i<=mid){temp[k]=a[i]; k++; i++;} //把多出的无法比较的部分,依次放入temp数组中
while(j<=end){temp[k] = a[j]; k++; j++;}
int step = start;
for (int i = 0; i <= end - start; i++) {//将temp数组,从start到end复制到原数组当中
a[step] = temp[i];
step++;
}
for (int i = 0; i <=end - start; i++) {
cout << a[i]<<" ";
}
cout << endl;
};
该方法思路较简单。
难点在于边界的判断,可插入断点来分段进行检查