南京邮电大学——用分治法实现一组无序序列的两路合并排序
(非常简单,学弟学妹们不要直接复制粘贴,至少先在B站上听懂原理)
void merge(int a[],int left,int right){
int m=right-left+1;
int b[m],i=0,left0=left;
int mid=(left+right)/2,k=mid+1;
while((left<=mid)&&(k<=right)){
if(a[left]<a[k])
b[i++]=a[left++];
else
b[i++]=a[k++];
}
if(left>mid)//第一个子序列有剩余
for(;k<=right;k++)
b[i++]=a[k];
if(k>right)//第二个子序列有剩余
for(;left<=mid;left++)
b[i++]=a[left];
for(int j=0;j<m;j++)
a[left0++]=b[j];
}
void merge_sort(int a[],int left,int right){
if(left==right)
return;
if(left<right){
int mid=(left+right)/2;
merge_sort(a, left,mid);
merge_sort(a, mid+1, right);
merge(a,left,right);
}
}
void input(int a[],int n){
int i;
for(i=0;i<n;i++){
cin>>a[i];
}
}
void output(int a[],int n){
int i;
for(i=0;i<n;i++){
cout<<a[i]<<" ";
}
}
int main(){
int n;
cout<<"两路合并排序算法"<<endl;
cout<<"请输入比较个数"<<endl;
cin>>n;
int a[n];
cout<<"请输入"<<n<<"个数"<<endl;
input(a,n);
merge_sort(a,0,n-1);
cout<<"排序后序列是:"<<endl;
output(a,n);
cout<<endl;
}
运行结果: