归并排序

来源:互联网 发布:hifi音频播放软件 编辑:程序博客网 时间:2024/05/17 02:39

一、归并排序


#include<iostream>using namespace std;class Merge_sort{private:int *a;int n;public:Merge_sort(){}Merge_sort(int N){a=new int[N];n=N;}void get(){for(int i=0;i<n;i++)cin>>a[i];}void sort(){mergesort(0,n-1);}void mergesort(int l,int r){int m=(l+r)/2;if(r<=l)return;mergesort(l,m);mergesort(m+1,r);merge(l,m,r);}void merge(int l,int m,int r){int *p=new int[r-l+1];int i=l,j=m+1,k=0;while(i<=m&&j<=r)p[k++]=(a[i]<a[j]?a[i++]:a[j++]);if(i>m)for(;j<=r;)p[k++]=a[j++];elsefor(;i<=m;)p[k++]=a[i++];for(i=l;i<=r;i++)a[i]=p[i-l];}void print(){for(int i=0;i<n;i++)cout<<a[i]<<" ";cout<<endl;}};int main(){int n;while(cin>>n){Merge_sort a(n);a.get();a.sort();a.print();}return 0;}

时间复杂度:o(nlogn)

空间复杂度:o(n)

是一种稳定排序


二、归并排序强化版


void merge(int l,int m,int r){int *p=new int[r+1];int i,j,k;for(i=m+1;i>l;i--)p[i-1]=a[i-1];for(j=m;j<r;j++)p[r+m-j]=a[j+1];for(k=l;k<=r;k++){if(p[i]<p[j])a[k]=p[i++];else a[k]=p[j--];}}

时间复杂度:o(nlogn)

空间复杂度:o(n)

是一种稳定排序

0 0
原创粉丝点击