排序-----二分治

来源:互联网 发布:论文图是用什么软件 编辑:程序博客网 时间:2024/06/06 18:41

关于二分治的排序,我们用到的是递归思想,直至数组只含有一个元素的时候,再利用合并的思想,根据预先设计好的排列方式进行代码的优化过程。对于合并的过程,首先应该计算数组被分开两端的分别长度,然后再定义两个数组,分别用于存储前后两个部分的元素,对于元素的进入,要进行所谓的正确方法,书上定义了一个末值标记点,但是我认为这是没有必要的,因为我们只需找到最后一个元素即可,然后将剩余的直接拿下来。。总之二分制的思想无非就是分和合,什么时候分,以及怎样去分这是关键,闲话少说,还是直接上代码吧;

C语言: Codee#12903
#include <stdio.h>
#define MAX 1000
void Merage(int *a,int p,int q,int r)
{
    int n1=q-p+1;
    int n2=r-q;
    int i,j,k;
    int b[MAX],c[MAX];
    for(i=1;i<=n1;i++)
    {
        b[i]=a[p+i-1];
    }
    for(j=1;j<=n2;j++)
    {
        c[j]=a[q+j];
    }
    i=j=1;
    for(k=p;k<=r;k++)
    {
        if(c[i]<=b[j])
        a[k]=b[j++];
        else
        a[k]=c[i++];
    }
}
void Merage_Sort(int *a,int p,int r)
{
    int q;
    if(p<r)
    {
        q=(p+r)/2;
        Merage_Sort(a,p,q);
        Merage_Sort(a,q+1,r);
        Merage(a,p,q,r);
    }
    else
    return;
}
int main()
{
    int a[MAX];
    int n;
    int i;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        Merage_Sort(a,1,n);
        for(i=1;i<=n;i++)
        {
            printf("%d ",a[i]);
        }
        printf("/n");
    }
    return 0;
}
原创粉丝点击