归并排序——求逆序对个数

该博客介绍了一种利用归并排序算法来计算数组中逆序对的方法。提供的代码实现通过递归将数组分成两部分,然后在合并过程中计算逆序对。`mergePair`函数负责合并和计数,返回逆序对总数。测试用例展示了如何使用这个函数处理一个具体的数组。
摘要由CSDN通过智能技术生成

求解逆序对个数

逆序对
对于一个包含N个非负整数的数组A[1…n],如果有i < j,且A[ i ]>A[ j ],则称(A[ i] ,A[ j] )为数组A中的一个逆序对。
例如,数组(3,1,4,5,2)的逆序对有(3,1),(3,2),(4,2),(5,2),共4个

func reversPairNumber(arr []int) int {
	if arr == nil || len(arr) < 2 {
		return 0
	}
	return processPair(arr, 0, len(arr) - 1)
}

// arr[L..R]既要排好序,也要求逆序对数量返回
// 所有merge时,产生的逆序对数量,累加,返回
// 左 排序 merge并产生逆序对数量
// 右 排序 merge并产生逆序对数量
func processPair(arr []int, l, r int) int {
	if l == r {
		return 0
	}
	// l < r
	mid := l + (r - l) >> 1
	return processPair(arr, l, mid) + processPair(arr, mid+1, r) + mergePair(arr, l, mid, r)
}

func mergePair(arr []int, l, m, r int) int {
	help := make([]int, r-l+1)
	i := len(help) - 1
	p1, p2, res := m, r, 0
	for p1 >= l && p2 > m {
		if arr[p1] > arr[p2] {
			res += p2 - m
		}

		if arr[p1] > arr[p2] {
			help[i] = arr[p1]
			p1--
		} else {
			help[i] = arr[p2]
			p2--
		}
		i--
	}

	for p1 >= l {
		help[i] = arr[p1]
		i--
		p1--
	}
	for p2 > m {
		help[i] = arr[p2]
		i--
		p2--
	}
	for j := 0; j < len(help); j++ {
		arr[l + j] = help[j]
	}
	return res
}

func TestReversPairNumber(t *testing.T) {
	arr := []int{3, 1, 4, 5, 2}
	t.Log(reversPairNumber(arr))
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

metabit

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

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

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

打赏作者

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

抵扣说明:

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

余额充值