Swift-数组中的逆序对

题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。例如,有一个数组为Array[0..n] 其中有元素a[i],a[j].如果 当i<j时,a[i]>a[j],那么我们就称(a[i],a[j])为一个逆序对。在数组{7,5,6,4}中一共存在5对逆序对,分别是(7,6),(7,5),(7,4),(6,4),(5,4).
核心代码:
<pre><code>`
func reversPairs(arr:inout [Int],low:Int,high:Int) -> Int {
if low >= high {
return 0
}
let mid:Int = (low+high)/2

    let leftCount:Int = reversPairs(arr: &arr, low: low, high: mid)
    let rightCount:Int = reversPairs(arr: &arr, low: mid+1, high: high)
    return leftCount + rightCount + merge(arr: &arr, low: low, mid: mid, high: high)
}

func merge(arr:inout [Int],low:Int,mid:Int,high:Int) -> Int {
    let count:Int = high - low + 1
    var tempArr:[Int] = [Int].init(repeating: 0, count: count)
    
    var left:Int = low //左指针
    var right:Int = mid + 1 //右指针
    var index:Int = 0
    var reverseCount:Int = 0
    
    while left <= mid && right <= high {
        if arr[left] < arr[right] {
            tempArr[index] = arr[left]
            left += 1
        } else {
            reverseCount += mid-left+1 // 统计逆序对
            tempArr[index] = arr[right]
            right += 1
        }
        index += 1
    }
    
    while left <= mid {
        tempArr[index] = arr[left]
        left += 1
        index += 1
    }
    
    while right <= high {
        tempArr[index] = arr[right]
        right += 1
        index += 1
    }
    
    for m in 0..<tempArr.count {
        arr[low+m] = tempArr[m]
    }
    
    return reverseCount
}`</code></pre>

测试代码:
<pre><code>var reversePair:ReversePairs = ReversePairs() var sortData:[Int] = [7,5,6,4] var reverseCount:Int = reversePair.reversPairs(arr: &sortData, low: 0, high: sortData.count-1) print("FlyElephant-逆序对的数量---\(reverseCount)")</code></pre>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容