分治算法——归并排序

1.算法思想(分治法)
-分治法
将问题分解为几个规模较小但是类似的子问题,递归地求解这些子问题,然后将这些子问题合并。
-分治法的基本模式
分解:将原问题分解为若干个子问题,这些子问题是原问题的规模较小的问题,求解方法与原问题一致。
解决:递归的去求解,当问题规模足够小时可以直接求解。
合并:将子问题的解合并成原问题的解,这一过程不同的问题方法各不相同。
-分治法在归并排序中的应用
分解:将待排序的n个元素分成各具有n/2个元素的子序列。
解决:当子序列只有一个元素时(子问题规模足够小),该序列已经排好。
合并:合并两个已经排好序的序列,直到合并成一个序列。
2.算法实现
-合并算法
两个待排的序列可以看成两堆按大小排列好的扑克牌,最小的扑克牌在牌堆的最上面,现在将两堆扑克牌合并。只要将两个牌堆最上面的两张牌比较大小,取较小的牌置于新的牌堆上。直到一个牌堆为空时,将另一个牌堆直接放到新牌堆上即可。这里在代码实现时,使用了哨兵节点,也就是在牌堆底部加上一张最大的牌,这样不会出现牌堆为空的现象。结束的判断则变成了,比较次数的判断,假设一共有n张牌,则需要比较n-1次。

  • 代码实现
void merge(int *A,int start,int mid,int end){
   
//这里的mid是两个待排序列的分界位置,可以合并两个不等长的序列
    int *array1,*array2;
    int length1,length2;
    int i,j,k;
    length1=mid-start+1;
    length2=end-mid;
    array1=malloc(sizeof(int)*(length1+2));
    array2=malloc(sizeof(int)*(length2+2));
    //array1和array2是申请的存放已排好序列的两个数组,因为要放置哨兵,并从1的位置开始存储数据,故需要申请length+2个空间
    for(i=1;i<=length1;i++){
   
        array1[i]=A[start+i-1];
    }
    for(j=1;j<=<
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值