/****------------------***
归并排序:(n logn)
算法基本思想:将两个及以上的有序表合成一个新的有序表
时间复杂度分析:主要两个函数的时间花销T[n]=数组的划分(O(n))和有序数组的归并排序(T[n/2])
公式:T[n]=2T[n/2]+O(n);
结果:T[n]=O(nlogn);
空间复杂度:O(n)
优点:非常稳定
***------------------****/
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100006;
int b[maxn];
void merge(int arr[],int l,int mid,int r){
int temp[maxn];
int i=l,j=mid+1;
int k=0;
int m=mid;
int n=r;
while(i<=m&&j<=n){
if(arr[i]<arr[j]){
temp[k++]=arr[i++];
}else{
temp[k++]=arr[j++];
}
}
while(i<=m){
temp[k++]=arr[i++];
}
while(j<=n){
temp[k++]=arr[j++];
}
for(int i=0;i<k;i++){
arr[l+i]=temp[i];
}
}
void merge_sort(int arr[],int l,int r){
if(l>=r)return ;
int mid=(l+r)/2;
merge_sort(arr,l,mid);
//printf("%d%d",arr[0],arr[1]);
merge_sort(arr,mid+1,r);
//printf("%d%d",arr[2],arr[3]);
merge(arr,l,mid,r);
//printf("*%d%d%d%d*",arr[0],arr[1],arr[2],arr[3]);
}
void my_merge_sort(int arr[],int n){
merge_sort(arr,0,n-1);
}
int main(){
int a[maxn];
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
my_merge_sort(a,n);
for(int i=0;i<n;i++){
if(i)printf(" ");
printf("%d",a[i]);
}
printf("\n");
}
数据结构归并排序及其实现
猜你喜欢
转载自blog.csdn.net/running_acmer/article/details/80872500
今日推荐
周排行