归并排序

归并排序详解

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
在讲归并排序前,先看一看合并排序吧。
合并排序顾名思义就是合并,将讲两个数组合并到一个数组的排序方式。简单的讲就是对两个已经进行排序的数组进行合并到第三个数组。比较两个数组的元素的大小,将小的一个录入第三个数组,一次一次比较。当一个数组没有元素后,直接将另一个数组直接移到第三个素组就行了。
代码如下:

void memerarray(int a[],int n,int b[],int m,int c[])
{
    int i=0,j=0,k=0;
    while(i<n&&j<m)
    {
        if(a[i]<b[j])
            c[k++]=a[i++];
        else
            c[k++]=b[j++];
    }
    while(i<n)
        c[k++]=a[i++];
    while(j<m)
        c[k++]=b[j++];
}

合并排序排序是在已知有序序列的情况下进行合并,当序列无序呢?
接下来进行归并排序,去解决这个问题。

void memerarry(int a[],int first,int mid,int last,int b[])
{
    int i=first,j=mid+1;
    int n=mid,m=last;
    int k=0;
    while(i<=n&&j<=m)
    {
        if(a[i]<a[j])
            b[k++]=a[i++];
        else
            b[k++]=a[j++];
    }
    while(i<=n)
    {
        b[k++]=a[i++];
    }
    while(j<=m)
        b[k++]=a[j++];
    for(int i=0;i<k;i++)
        a[first+i]=b[i];
}
void mergesort(int a[],int first,int last,int b[])
{
    if(first<last)
    {
        int mid=(first+last)/2;
        mergesort(a,first,mid,b);
        mergesort(a,mid+1,last,b);
        memerarry(a,first,mid,last,b);
    }
}

归并排序效率是比较高的。

原文地址:https://www.cnblogs.com/nanfenggu/p/7900098.html