问题描述
归并排序
代码
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<stdlib.h>
#define N 100001
using namespace std;
void MergeSort(int a[],int low,int high);
void Merge(int a[],int low,int mid,int high);
int b[N];
int main(void) {
int n;
int a[N];
scanf("%d",&n);
for(int i=1; i<=n; i++) {
scanf("%d",&a[i]);
}
//int *b=(int *)malloc((n+1)*sizeof(int));
MergeSort(a,1,n);
for(int i=1; i<=n; i++) {
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
void MergeSort(int a[],int low,int high) {
//用归并排序法 将序列a中的元素从小到大排序
//int TR2[N+1];
if(low<high){
int mid=(low+high)/2 ;
MergeSort(a,low,mid);
MergeSort(a,mid+1,high);
Merge(a,low,mid,high);
}
}
void Merge(int a[],int low,int mid,int high) {
int i,j,k;
for(k=low;k<=high;k++){
b[k]=a[k];//将a中所有元素复制到b中
}
for(i=low,j=mid+1,k=i;i<=mid && j<=high;k++) {
if(b[i]<=b[j]){
a[k]=b[i++];
}else{
a[k]=b[j++];
}
}//for
while(i<=mid){
a[k++]=b[i++];//若第一个表未检测完 ,复制
}
while(j<=high){
a[k++]=b[j++];//若第二个表未检测完 ,复制
}
}