C语言基于归并排序求逆序对问题(完整C代码)

本文探讨如何在二路归并排序的基础上解决逆序对问题,通过详细分析【7,5,6,4】数组的排序过程,阐述了在每次归并时如何计算逆序对数量。关键在于利用归并排序中已排序序列的特点,当遇到前一部分的元素大于后一部分的元素时,计算逆序对的数目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 引言二路归并排序采用把一个数组分割为单独的元素并且相邻两组合并的同时排序的方法进行数组的排序。具体的实现在任何一本数据结构书中都有描述,也不难理解。

今天我们来说说如何在归并的基础上,研究逆序对问题(给出完整C语言代码,已编译)

我们以【7,5,6,4】这个数组为背景

通过层层递归拆分为 【7】【5】【6】【4】四个单独的部分,然后采用二路归并(相邻两个进行合并且同时从小到大排序),得到【5,7】和【4,6】两个部分。然后继续二路归并得到【4,5,6,7】序列。

【注:在一次归并开始时,low指向左分区的第一个结点不变,i=low指向左分区第一个结点,mid指向左分区最后一个结点不变,j=mid+1,j指向右分区第一个结点,high指向右分区最后一个结点不变】

我们来分析上述过程的细节:其中 7,5进行排序时,i指针指向7,j指针指向5。我们心里把7 和5当作两个已经排好序的序列,所以当出现arr[i]>arr[j]的时候,也就是前面分区的某一项大于后面分区的某一项时,前面分区从第i项到分区最后一个数(mid)都会比这个a[j]大,所以类似人脑计算的模式,锁定这个小的数字,然后找有多少个比他大的数就行,因此

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值