排序算法之—二路归并排序

//归并排序:
#include<stdio.h>
#include<stdlib.h>
/*先写将两个有序表合并为一个有序表的算法merge()
设两个有序表放在同一个数组中相邻的位置上R[lwo...mid],R[mid+1...high]
先将他们合并到一个暂时的数组R1中,待合并完成后复制回R中。
每次从两个段中取出一个关键字比较,较小的放入R1,若哪一段有剩余,则直接复制进R1
再复制回R
*/
void Merge(int R[],int low,int mid,int high)//归并两个有序数组
{
    int *R1;//变长临时数组
    int i=low ,j=mid+1, k=0;//k是R1的下标,i,j是两段的下标
    R1=(int*)malloc((high-low+1)*sizeof(int));//动态分配空间
    while(i<=mid &&j<=high)//两段都没有扫描完时执行循环
    {
        if(R[i] <= R[j])//若第一段的小则将第一段的元素放到R1中
        {
            R1[k]=R[i];
            i++;
            k++;
        }
        else
        {
            R1[k]=R[j];
            j++;
            k++;
        }
    }
    while(i<=mid)//第一段没有扫描完
    {
        R1[k]=R[i];//第1段剩下的复制到R1
        i++;k++;
    }
    while(j<=high)//第2段没有扫描完
    {
        R1[k]=R[j];//第二段剩下的复制到R1
        j++;k++;
    }
    for(k=0,i=low;i<=high;k++,i++)//把R1复制到R中去
    {
        R[i]=R1[k];
    }
    free(R1);


}

void MergeSortDC(int R[],int low,int high)//对R【low。。high】进行递归归并排序
{
    int mid;
    if(low<high)
    {
        mid=(low+high)/2;
        MergeSortDC(R,low,mid);
        MergeSortDC(R,mid+1,high);
        Merge(R,low,mid,high);
    }
}
void Mergesot1(int R[],int n)//传一个数组R,有n个元素,便于调用
{
    MergeSortDC(R,0,n-1);
}

void disp(int R[],int n)
{
    int i=0;
    for( i=0;i<n;i++)
    {
        printf("%d ",R[i]);
    }
    printf("\n\n");
}
int main()
{
int R[6]={1,9,3,0,2,5};
Mergesot1(R,6);
disp(R,6);
}


0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注