合并排序

自己写了一下,不知道是不是我写的太繁琐的原因,怎么写完之后觉得和之前的几个排序方法比起来,代码好长啊。怪了~~~~
#include<iostream>
using namespace std;

template <class T>
void Copy(T a[],T b[],int left,int right)
{
    int size=right-left+1;
    for(int i=0;i<size;i++)
    {
        a[left++]=b[i];
    }
}

//合并有序数组a[left:i],a[i+1:right]到b,得到新的有序数组b
template <class T>
void Merge(T a[],T b[],int left,int i,int right)
{
    //指向第一个数组开头
    int a1cout=left,
    //指向第一个数组结尾
    a1end=i,
    //指向第二个数组开头
    a2cout=i+1,
    //指向第二个数组结尾
    a2end=right,
    //指向b中的元素
    bcout=0;
    for(int j=0;j<right-left+1;j++)
    {
        //如果第一个数组结束,拷贝第二个数组的元素到b
        if(a1cout>a1end)
        {
            b[bcout++]=a[a2cout++];
            continue;
        }
        //如果第二个数组结束,拷贝第一个数组的元素到b
        if(a2cout>a2end)
        {
            b[bcout++]=a[a1cout++];
            continue;
        }
        //如果两个数组都没结束,比较元素大小,把较小的放入b
        if(a[a1cout]<a[a2cout])
        {
            b[bcout++]=a[a1cout++];
            continue;
        }
        else
        {
            b[bcout++]=a[a2cout++];
            continue;
        }
    }
}

template <class T>
void MergeSort(T a[],int left,int right)
{
    T *b=new int[right-left+1];
    if(left<right)
    {
        //取中点
        int i=(left+right)/2;
        MergeSort(a,left,i);
        MergeSort(a,i+1,right);    
        Merge(a,b,left,i,right);
        Copy(a,b,left,right);
    }
}

//测试
void main()
{
    int arr[]={3,65,23,4,86,12,43,25,19,7};
    int len=sizeof(arr)/sizeof(int);
    MergeSort(arr,0,len-1);
    for(int i=0;i<len;i++)
        cout<<arr[i]<<endl;
}
还是请大家多多指教~~~

你可能感兴趣的:(职场,合并排序,休闲)