归并排序的实现及测试

归并(Merge)排序法:将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列
在执行过程中一直调用一个划分过程,直到子序列为空或者只有一个元素为止,共需log2n次递归,在归并的过程中依次归并长度为2、4…..的子序列,直到整个序列有序

归并图示
这里写图片描述

归并的实现

#define MAXSIZE 20  //默认定义数据大小为20
#define T int

typedef T Seqlist[MAXSIZE];

void merge(Seqlist &L,Seqlist &sq,int left,int mid,int right)//合并
{
    for(int i = left;i<=right;++i)   //赋值
    {
        sq[i] = L[i];
    }
    int s1 = left;
    int s2 = mid + 1;
    int k = left;
    while(s1<=mid && s2 <=right)
    {
        if(sq[s1]<=sq[s2])
        {
            L[k++] = sq[s1++];
        }
        else
        {
            L[k++]= sq[s2++];
        }
    }
    while(s1 <= mid)//左边还有值,而右边已经到达界限
    {
        L[k++] = sq[s1++];
    }
    while(s2 <= right)
    {
        L[k++] = sq[s2++];
    }
}

void Merge_sort(Seqlist &L,Seqlist &sq,int left,int right)
{
    if(left >= right)
    return;
    int mid = (left + right)/2;//将数据分为两部分
    Merge_sort(L,sq,left,mid);//对左边数据进行归并排序
    Merge_sort(L,sq,mid+1,right);//对右边数据进行归并排序
    merge(L,sq,left,mid,right);//将左右两部分数据进行合并
}

归并的测试文件

void main()  //归并排序测试
{
    Seqlist L = {16,33,9,8,25,21,3,49,5};
    Seqlist sq;
    int n = 9;
    Merge_sort(L,sq,0,8);
    for(int i = 0;i < n;++i)  
    {
        cout<<L[i]<<"  ";
    }
}

归并排序的主要问题是它需要一个与原数据一样大的辅助空间。归并排序是一种稳定的排序方法。

猜你喜欢

转载自blog.csdn.net/qian_xia_er/article/details/80040174