求解逆序对个数
逆序对
对于一个包含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))
}