合并排序

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

#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;

}

还是请大家多多指教~~~

点赞