归并排序的方法就是:
(1)把前一半排序
(2)把后一半排序
(3)把两半归并到一个新的有序数组,然后再拷贝回原数组
归并的过程就是将两个数组进行比较,放到一个新的数组中暂时存放。
代码
#include<iostream>
using namespace std;
int a[100];
int b[100];
void merge(int a[],int L,int mid,int R,int temp[])
{
int pb=0;
int p1=L,p2=mid+1;
while(p1<=mid&&p2<=R)
{
if(a[p1]<a[p2])
temp[pb++]=a[p1++];
else
temp[pb++]=a[p2++];
}
while(p1<=mid)
{
temp[pb++]=a[p1++];
}
while(p2<=R)
{
temp[pb++]=a[p2++];
}
for(int i=0;i<R-L+1;i++)
a[L+i]=temp[i];
}
void mergesort(int a[],int L,int R,int temp[])
{
if(L<R)
{
int mid=L+(R-L)/2;
mergesort(a,L,mid,temp);
mergesort(a,mid+1,R,temp);
merge(a,L,mid,R,temp);
}
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
mergesort(a,0,n-1,b);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}
…
…
…
…
…
…
时间复杂度分析
写出递推公式
T(n)=2T(n/2)+an
意思就是排序一个数组,可以分开两半,排序前一个和后一个数组的时间,加上一个归并过程如上,时间为an。终止条件是T(1)时,n/2^k=1(此时k=log(n)),最后可得出总的时间复杂度为nlog(n)