c++归并算法深入解析(行代码注释解析)(小白写作,有错误,请指正)

//归并排序
//01 递归形式做法
#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std;

void merge1(int arr[], int temp[], int start, int mid, int end){
    //对于merge操作主要描述下来就是将2个已经有序的序列进行合并
    //就是定义两个指针和一个与两个序列元素数量之和相同的数组temp,
    //从这两个序列a, b开头开始比较,如果a[i]>b[j],就将b[j]放入temp中间数组
    //反之就将a[i]放入temp数组,这个k就是那个temp数组的指针
    //之后有2中特殊情况,之后描述
    int i = start, j = mid + 1, k = start;
    //这里判断就是为了将i, j这代表2个序列的的下标控制住
    while(i < mid + 1 && j < end + 1){
        //虽然前面举例子是a[i], b[j],但是这里面这两个有序序列
        //是以mid为分界线的同一个数组中的2个序列,所以叫做二路归并
        if(arr[i] < arr[j]){
            temp[k] = arr[i];
            //注意将2个指针都向后移动
            i++, k++;
        }else{
            temp[k] = arr[j];
            j++, k++;
        }
    }
    //这里的条件判断如果成立,就代表前面的判断是j<end+1不满
    //足,所以这里就是特殊情况:其中一个序列a已经遍历完成,另外一个
    //序列b还没有完成,那么因为我们做的操作是将两个已经有序的序列
    //合成成为一个序列,那么就代表没有遍历完成的序列b已经有序,
    //所以将之后的序列全部插入就可以
    while(i < mid +1){
        temp[k] = arr[i];
        i++, k++;
    }
    //这里和上面这一种情况一致
    while(j < end + 1){
        temp[k] = arr[j];
        j++, k++;
    }
    //这里就是将已经排好序的数组temp再赋值给arr,
    //这个temp数组的使命就是存放排好序的数组之后再赋值给原数组
    for(i = 0;i < end+1;i++){
        arr[i] = temp[i];
    }
}

void merge_sort1(int arr[], int temp[], int start, int end){
    //当start >= end的时候,代表已经分到了最小,也就是1个元素
    //当然也就是有序了
    if(start >= end)
        return;
    //这里使用小+(大-小)/2的原因是担心数据越界,也就是假如
    //小=大=2^32-1,那么小+大就会越界
    int mid = start + (end - start) / 2;
    //进入递归,首先是将首元素到mid-1为止的元素变得有序
    merge_sort1(arr, temp, start, mid);
    //进入递归,这里是将mid+1的元素到end的元素都变得有序
    merge_sort1(arr, temp, mid+1, end);
    //这里是将2个有序的序列进行合并,也就是归并排序的核心操作
    merge1(arr, temp, start, mid, end);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值