您的位置:首页 > 编程语言 > C语言/C++

合并排序的c语言实现

2014-08-13 21:11 169 查看
#include <stdio.h>
/*

    merge()作用:把A[p]-A[q]和A[q+1]-A[r]两个递增的数组合并为一个数组A[r]中

*/

void merge(int A[],int p,int q,int r)

{

    int *bp = new int[r-p+1];

    int i=p,j=q+1,k=0;    

    while(i<=q&&j<=r)

    {

        if(A[i]<A[j])

        {

            bp[k++]=A[i++];

        }else

        {

            bp[k++]=A[j++];

        }

    }

    if(j<=r)

    {

        while(j<=r)

        {

            bp[k++]=A[j++];

        }

    }

    if(i<=q)

    {

        while(i<=q)

        {

            bp[k++]=A[i++];

        }

    }

    k=0;

    while(p<=r)

    {

        A[p++]=bp[k++];

    }

}

/*

    i:合并的开始项

    s:合并之前项的大小

    t:合并之后项的大小

*/

void merge_sort(int A[],int n)

{

    int i,s,t=1;

    t=1;

    while(t<n)

    {

        i=0;

        s=t;

        t=2*s;

        while(i+t<n)

        {/*

         两种情况会终止

            1,i+s<n但是i+s>n 对于这种情况下面的if(i+s<n)会处理,把i+s-1和i+s到n-1项合并

            2,i+s<n 留到下一次去合并

         */

            merge(A,i,i+s-1,i+t-1);

            i=i+t;

        }

        if(i+s<n)

            merge(A,i,i+s-1,n-1);

    }

}

int main()

{

    /*

    测试前面的 merge()函数

    int A[10]={2,3,11,44,50,11,17,43,78,112};

    int i=0;

    merge(A,0,4,9);

    for(i=0;i<=9;i++)

    printf("%d   ",A[i]);

    */

    int A[10]={1,4,22,33,55,11,23,43,12,32};

    merge_sort(A,10);

    for(int i=0;i<=9;i++)

        printf("%d  ",A[i]);

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: