归并排序

来源:互联网 发布:流量免费打电话软件 编辑:程序博客网 时间:2024/06/10 07:57

归并排序利用递归和分治技术将数据序列划分为越来越小的半子表,在对半子表排序,最后在用递归将排序好的半子表合并成为越来越大的有序数组。 时间复杂度为:O(nlogn)。

程序代码:

#include<iostream>using namespace std;void Merge(int a[],int l,int q,int r){int i,j,k,nl,nr;nl=q-l+1;nr=r-q;int *L=new int[nl];int *R=new int[nr];for(i=0,k=l;i<nl;i++,k++)L[i]=a[k];for(i=0,k=q+1;i<nr;i++,k++)R[i]=a[k];for(k=l,i=0,j=0;i<nl&&j<nr;k++){if(L[i]>R[j]){a[k]=R[j];j++;}else{a[k]=L[i];i++;}}if(i<nl){for(j=i;j<nl;j++,k++)a[k]=L[j];}if(j<nr){for(i=j;i<nr;i++,k++)a[k]=R[i];}delete L;delete R;}void Mergesort(int a[],int l,int r){if(l<r){int q=(l+r)/2;Mergesort(a,l,q);Mergesort(a,q+1,r);Merge(a,l,q,r);}}void Show(int *a,int n){for(int i=0;i<n;i++)cout<<a[i]<<"  ";cout<<endl;}int main(){int i=0;int a[]={1,3,5,7,9,2,4,6,8,0};int length_a=sizeof(a)/sizeof(a[0]);cout<<"排序前:";Show(a,length_a);Mergesort(a,0,length_a-1);cout<<"排序后:";Show(a,length_a);cout<<endl;system("pause");return 0;}


输出结果:



0 0
原创粉丝点击