二路-归并排序归纳

【递归二路划分 + 分割后的2个数组归并】

//归并排序:递归二路划分+归并思想==二路,归并排序
//函数的参数列表是:a,l,r;这是每次需要循环递归的初始条件 :数组(操作对象),两个端点
//不需要初始化端点,端点由函数传入

    //1、二分+ 2.两个左右两边的倒叙递归;由里向外
void Two_divide_Merge_Sort(int a[],int left ,int right){    
    if (left < right)
    {
        int mid = (left + right) / 2;
        Two_divide_Merge_Sort(a,left,mid);//左边部分二分。   递归1的从内到外
        Two_divide_Merge_Sort(a, mid + 1, right); //右边部分二分。   递归2的从内到外
        //下面是函数的最小单元的操作了:归并、
        //对已经分成的两段数组,进行归并排序
        merge1(a, left, mid, mid + 1, right);                       //循环体
    }
}

===============下面是归并子函数================
//一个数组,分成两段,有2对首尾端点.归并+合并到原来的数组
void merge1(int a[],int l1 ,int r1,int l2,int r2){
    //由函数参数列表已经把数字分成了两个数组
    int i = l1, j = l2;//初始化指针

    int temp[1001] = { 0 }; int index = 0;
    while (i<= r1 && j <= r2){ //注意是可以取到等号的 因为是从l1开始的
        if (a[i] <= a[j]) //注意是可以取到等号,两个元素可以相等
        {
            temp[index++] = a[i];
            i++;
        }
        else{
            temp[index++] = a[j++];
        }
    }
    while (i <= r1){
        temp[index++] = a[i];
        i++;
    }
    while (j <= r2){
        temp[index++] = a[j];
        j++;
    }

    //2、合并到传入参数的数组中
    for (int i = 0; i < index; i++)
    {
        a[l1 + i] = temp[i];
    }

}



int a[8] = { 7, 3, 4, 1, 5, 4, 6, 9 };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值