递归的归并排序

递归的归并排序

算法思维

  1. 利用递归的特性,先将当前序列的子序列并归,再并归当前序列

算法设计

  1. 递归结束条件,当前序列的长度为1
  2. 并归前一个子序列
  3. 归并后一个子序列
  4. 对当前序列进行并归

算法实现

// 递归归并排序算法
void sort_mergeSort(int* arr, int len, int mode)
{
    int* arr_tmp = (int* )malloc(sizeof(int) * len);
    sort_mergeSort_main(arr, arr_tmp, 0, len-1, mode);
}

// 递归并归的执行函数
void sort_mergeSort_main(int* arr, int* arr_tmp, int s, int e, int mode)
{

    if(s == e) // 如果只有一个元素,直接赋值
    {
        arr_tmp[s] = arr[s];
    }
    else
    {
        int m = (s+e)/2;
        // 先并归前后两个子序列
        sort_mergeSort_main(arr, arr_tmp, s, m, mode);
        sort_mergeSort_main(arr, arr_tmp, m+1, e, mode);

        // 将两个子序列进行并归
        int s_1 = s, e_1 = m+1, s_2 = m+1, e_2 = e+1;
        int k = s;

        while(s_1 < e_1 && s_2 < e_2)
        {
            arr[k++] = sort_judgeWithMode(arr_tmp[s_1], arr_tmp[s_2], mode)? arr_tmp[s_1++]: arr_tmp[s_2++];
        }
        while(s_1 < e_1) arr[k++] = arr_tmp[s_1++];
        while(s_2 < e_2) arr[k++] = arr_tmp[s_2++];

        // 将并归好的序列赋给原地址
        for(int i = s; i <= e; i ++)
        {
            arr_tmp[i] = arr[i];
        }

    }
}

运算结果

  1. 测试代码
    #define N 7
    
    int main()
    {
        int arr[N] = {49,38,65,97,76,13,27};
    
        sort_mergeSort(arr, N, 1);
        utils_print_arr(arr,0, N-1, "%2d ","升序排列结果:\n", "\n\n");
    
        sort_mergeSort(arr, N, 0);
        utils_print_arr(arr,0, N-1, "%2d ", "降序排列结果:\n", "\n");
    
        return 0;
    }
    
  2. 运算结果
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值