归并排序
思想
利用归并的思想,采用分治策略,将问题分解为小问题然后递归求解。
举例
代码模板
#include <bits/stdc++.h>
using namespace std;
void mergearray(int a[],int first,int mid,int last){
int temp[1001];
int i=first,j=mid+1;
int n=mid,m=last;
int k=0;
while(i<=n&&j<=m){
if(a[i]<a[j])
temp[k++]=a[i++];
else
temp[k++]=a[j++];
}
while(i<=n)
temp[k++]=a[i++];
while(j<=m)
temp[k++]=a[j++];
//把排好序的数放回a数组
for(int i=0;i<k;i++)
a[first+i]=temp[i];
}
void mergesort(int a[],int first,int last){
if(first<last){//多于一个元素
int mid=(first+last)/2;
mergesort(a,first,mid);//分
mergesort(a,mid+1,last);//分
mergearray(a,first,mid,last);//合(从1个元素开始)
}
}
int main(){
int n;
int a[1001];
cin>>n;
for(int i=0;i<n;i++)
cin>>a[i];
//对数组a进行排序
mergesort(a,0,n-1);
for(int i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
总结
1、代码与例子可以结合来看会比较好理解,即将一些数一直分直到只有一个数,然后进行合。
2、时间复杂度O(nlogn),对每一层合并子区间的过程,每个元素都会被操作一次,一共有logn层,所以时间复杂度O(nlogn)。
3、推荐阅读:
(1) 归并排序(分治法)
(2) 快速排序&归并排序—时间复杂度分析