归并排序 Merge Sort

对n个元素进行排序,n个元素可以看成n个长度为1的有序子数列。

两两合并,可以得到\left \lceil \frac{n}{2}\right \rceil个长度为2或1的有序子数列。

再两两合并,如此反复,最终得到长度为n的有序数列。

 

主要函数有2个

Merge,将前后两个相邻的有序数列合并为一个有序数列

假设在数列A中存在两段相邻的有序数列,A[low...mid], A[mid+1...high],先将它们复制到临时数组B中,然后每次从B中取出这两段有序数列的头部元素进行大小比较,将较小的放入A中,并向后移动该段有序数列的头部位置,当这两段有序数列中的其中一个头部位置已经超过了其末尾之时,将另一段有序数列剩余的部分直接复制到A余下的位置上即可。

int *B= (int *)malloc(n*sizeof(int));
void Merge(int A[],int low, int mid, int high){
    for(int k=low;k<=high;k++)
        B[k]=A[k]; //将A中元素全部复制到临时数组B中

    for(i=low, j=mid+1,k=i;i<=mid && j<=high;k++){
        if(B[i]<=B[j])  //比较临时数组B中原来两段有序数列的头部元素大小
            A[k]=B[i++];  //将较小的放回A中
        else
            A[k]=B[j++];
    }
    while(i<=mid)A[k++]=B[i++];  //如果第一段数列未检测完,复制剩余部分
    while(j<=high)A[k++]=B[j++];  //同理第二段
}

代码中两个while最终只会运行一个。

然后是MergeSort

void MergeSort(int A[], int low, int high){
    if(low<high){
        int mid=(low+high)/2;  //从中划分两个子数列
        MergeSort(A,low,mid);  //对左侧进行递归排序
        MergeSort(A,mid+1,high);  //右侧同理
        Merge(A,low,mid,high);  //合并左右结果
        
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值