算法分析与设计实践-作业四-二分归并排序

一、问题描述
二分归并排序:对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k

二、解析
1.设定两个指针,最初位置分别为两个已经排序序列的起始位置
2.比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
3.重复步骤3直到某一指针达到序列尾
4.将另一序列剩下的所有元素直接复制到合并序列尾
归并排序:
归并排序具体工作原理如下(假设序列共有n个元素):
1.将序列每相邻两个数字进行归并操作,形成floor(n / 2)个序列,排序后每个序列包含两个元素
2.将上述序列再次归并,形成floor(n / 4)个序列,每个序列包含四个元素
3.重复步骤2,直到所有元素排序完毕

三、代码设计

void merge(int *a, int low, int mid, int high) //归并操作  
{  
    int k, begin1, begin2, end1, end2;  
    begin1 = low;  
    end1 = mid;  
    begin2 = mid + 1;  
    end2 = high;  
    int *temp = (int *) malloc((high - low + 1) * sizeof(int));  
    for(k = 0; begin1 <= end1 && begin2 <= end2; k++) //自小到大排序  
    {  
        if(a[begin1] <= a[begin2])  
            temp[k] = a[begin1++];  
        else  
            temp[k] = a[begin2++];  
    }  
    if(begin1 <= end1) //左剩  
        memcpy(temp + k, a + begin1, (end1 - begin1 + 1) * sizeof(int));  
    else //右剩  
        memcpy(temp + k, a + begin2, (end2 - begin2 + 1) * sizeof(int));  
    memcpy(a + low, temp, (high - low + 1) * sizeof(int)); //排序后复制到原数组  
    free(temp); //释放空间  
}  
void merge_sort(int *a, unsigned int begin, unsigned int end)  
{  
    int mid;  
    if(begin < end)  
    {  
        mid=begin+(end-begin)>>1;  
        //mid = (end + begin) / 2;  防止数据加法溢出  
        merge_sort(a, begin, mid); //分治  
        merge_sort(a, mid + 1, end); //分治  
        merge(a, begin, mid, end);  //合并两个已排序的数列  
    }  
}  

四、时间复杂度
最好,最坏都为O(nlogn)。
五、源代码
https://github.com/yttb/hello-world

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值