算法导论笔记之----合并排序

来源:互联网 发布:数据交换平台技术规范 编辑:程序博客网 时间:2024/06/01 07:11
合并排序,思想很简单,先分再合,这种算法不仔细看,很容易以为是快速排序。实际上相差很大。合并排序,每次分,都是取中间的一个位置,然后用递归,将一组T个数据分成T组一个数据的数组,然后再合并起来。(都是根据数组的下标进行运算,所以从0开始)
///合并排序#include<iostream>using namespace std;void m_sort(int *arr,int begin,int middle,int end){    int M,N;    int i,j;    int *left,*right;    M=middle+1-begin;    N=end-middle;    left=new int[M];    right=new int[N];    memset(left,0,M*4);    memset(right,0,N*4);    for(i=0;i<M;++i)        left[i]=arr[begin+i];    for(i=0;i<N;++i)        right[i]=arr[middle+i+1];       i=j=0 ;    int t=begin;    while(i<M&&j<N)    {       if(left[i]<right[j])   arr[t++]=left[i++];   else   arr[t++]=right[j++];    }    while(i<M)    arr[t++]=left[i++];    while(j<N)    arr[t++]=right[j++];    delete left;    delete right;}void Merge(int *arr,int begin,int end){    int middle;    if(begin<end)    {        middle=(begin+end)/2;        Merge(arr,begin,middle);        Merge(arr,middle+1,end);        m_sort(arr,begin,middle,end);    }}int main(){    int T=0;int *arr;while(cin>>T,T){arr=new int[T];cout<<"please input "<<T<<"numbers: ";for(int i=0;i<T;++i)cin>>arr[i];        Merge(arr,0,T-1);        for(int i=0;i<T;++i)cout<<arr[i]<<" ";cout<<endl;delete arr;}return 0;}
图:
原创粉丝点击