归并排序的深入理解与逆序数的计算

###归并排序的深入理解与逆序数的计算

int temp[N];//临时数组储存数据
void merge_sort(int a[] , int l , int r)
{
    if (l >= r) return ; //递归的出口
    int mid = l + r >> 1;
    //分为一个单元
    merge_sort(a,l,mid);
    merge_sort(a,mid + 1,r);
    int k = 0 , i = l , j = mid + 1;
    //进行合并
    while (i <= mid && j <= r)
    {
        if (a[i] <= a[j]) temp[k ++] = a[i ++];
        else temp[k ++] = a[j ++];
    }
    while (i <= mid) temp[k ++] = a[i ++];
    while (j <= r) temp[k ++] = a[j ++];
    //恢复排好序的数组
    for (int i = l ,j = 0 ; i <= r ; i ++ , j ++) a[i] = temp[j];
}

要理解递归排序的过程:

在此模板中递归排序中 首先第一步为将数据分为俩部分,左边一半,右边一半。再用递归分别对俩边分组,直到将最短数据分为一个单位返回到上一层的递归 ,右半部分同样的递归。到剩俩个数据时临时储存进行排序,排序后再进行上一层的排序,归并排序的递归过程是一个树形结构。

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e6dD4GV2-1617775372708)(C:\Users\左泽平\Desktop\算法\算法思路截图\归并排序的过程.jpg)]

归并排序还可以用来求解逆序数:

//首先呢 : 归并排序从最小从左往右进行合并 ,
   while (i <= mid && j <= r)
    {
        if (a[i] <= a[j]) temp[k ++] = a[i ++];
        else temp[k ++] = a[j ++];
    }
    进行此处合并时,左右俩边已经有了顺序, 若 (a[i] > a[j]) 那么 a[j] 小于 a[i]这边序列大于a[i]的所有数 , 所以说逆序数是 mid - i + 1; 
    

i]的所有数 , 所以说逆序数是 mid - i + 1;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

觅你风川间!!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值