归并排序法的基本思想是:将带排序元素分成大小大致相同的2个子集合,分别对每个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合
归并排序的效率为O(nlogn),归并排序具有稳定性
归并排序可由将两个有序表合并为一个有序表来进行理解,理解了前一篇博客归并排序——将两个有序表直接归并为一个有序表,再来理解归并排序就较为简单了
#include<stdio.h>
#include<iostream>
using namespace std;
//声明
void mergesort(int a[],int n);
void merge(int b[],int c[],int a[],int p,int q);
//合并排序
//递归调用mergesort来对数组a[0……n-1]排序
void mergesort(int a[],int n){
if(n>1){
int p,q;//p为b[]的长度,q为c[]的长度
//当n是偶数时,前后两部分长度相同
if(n%2==0){
p=n/2;
q=n/2;
}
else{ //当n为奇数时,后半部分比前半部分多1一个
p=n/2;
q=n/2+1;
}
int *b=new int[p];
int *c=new int[q];
int t=0,w=0;
for(int i=0;i<n;i++){
if(i<p)
b[t++]=a[i]; //将前半部分赋值给b[]
else
c[w++]=a[i];//将后半部分赋值给c[]
}
mergesort(b,p);//递归分解左半部分
mergesort(c,q);//递归分解右半部分
merge(b,c,a,p,q);//合并
}
}
//将两个有序数组合并为一个有序数组
void merge(int b[],int c[],int a[],int p,int q){
int i=0,j=0,k=0;
while(i<p && j<q){
if(b[i]<c[j])
a[k++]=b[i++];
else
a[k++]=c[j++];
}
while(i<p){
a[k++]=b[i++];
}
while(j<q){
a[k++]=c[j++];
}
}
int main(){
int n;
cout<<"n:";
cin>>n;
int *a=new int[n];
cout<<"待排序:";
for(int i=0;i<n;i++){
cin>>a[i];
}
//合并排序
mergesort(a,n);
cout<<"排序后:";
for(int i=0;i<n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}