要求:
http://codeup.cn/problem.php?cid=100000586&pid=1
说明:
前面的代码拿来改改……
代码:
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
//二路归并排序,输出
const int maxn = 100010;
void merge(int A[],int L1,int R1,int L2,int R2){
int i = L1,j = L2;
int temp[maxn],index = 0;
while(i <= R1 && j <= R2){
if(A[i] <= A[j]){
temp[index++] = A[i++];
}
else{
temp[index++] = A[j++];
}
}
while(i <= R1) temp[index++] = A[i++];
while(j <= R2) temp[index++] = A[j++];
for(int i = 0;i <index;i++){
A[L1 + i] = temp[i];
}
}
void mergeSort(int A[],int left,int right){
if(left <right){
int mid = (left + right)/2;
mergeSort(A,left,mid);
mergeSort(A,mid + 1,right);
merge(A,left,mid,mid + 1,right);
}
}
int main(){
int A[maxn];
int n,m;
while(scanf("%d",&m) != EOF){
for(int x = 0;x <m;x++){
scanf("%d",&n);
for(int i = 0;i <n;i++){
scanf("%d",&A[i]);
}
//这里的n-1是最后边那个数的下标
mergeSort(A,0,n-1);
for(int j = 0;j <n;j++){
printf("%d\n",A[j]);
}
memset(A,0,sizeof(A));
}
}
return 0;
}