Merge Sort & Evaluate Inversions. Θ(nlgn)

Give an algorithm that determines the number of inversions in any permutation on n elements in O(nlgn) worst-case time.

///Merge Sort. Θ(nlgn)
func mergeInversionsSort<T: Comparable>(array: inout [T]) -> Int {
    return _mergeInversionsSort(array: &array, lower: 0, upper: array.count-1);
}

///Inner representation
func _mergeInversionsSort<T: Comparable>(array: inout [T], lower: Int, upper: Int) -> Int {
    guard lower < upper else { return 0 }
    //Note:upper+lower NOT upper-lower
    let divider = (upper+lower)/2
    var count = 0
    count += _mergeInversionsSort(array: &array, lower: lower, upper: divider)
    count += _mergeInversionsSort(array: &array, lower: divider+1, upper: upper)
    count += mergeInversions(of: &array, lower: lower, divider: divider, upper: upper)
    return count;
}

///Merge Inversion. Θ(n)
func mergeInversions<T: Comparable>(of array:inout [T], lower:Int, divider:Int, upper:Int) -> Int {
    var count = 0
    let prefix = Array(array[lower...divider])
    let suffix = Array(array[divider+1...upper])
    //Note:k = lower NOT k = 0
    var i = 0, j = 0, k = lower
    while i<prefix.count, j<suffix.count {
        if prefix[i] <= suffix[j] {
            array[k] = prefix[i]
            i += 1
        } else {
            array[k] = suffix[j]
            j += 1
            //Core inversions statistics
            count += prefix.count-i
        }
        k += 1
    }
    if i == prefix.count {
        while j < suffix.count {
            array[k] = suffix[j]
            k += 1
            j += 1
        }
    } else {
        while i < prefix.count {
            array[k] = prefix[i]
            k += 1
            i += 1
        }
    }
    return count
}

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

推荐阅读更多精彩内容

  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,448评论 0 10
  • 爹脚背上的那道疤痕 青枫 印象中,年轻时候的爹身体健硕,有使不完的力气。 而如今,爹却是佝偻着身子躺卧在床了! 由...
    青枫墨韵阅读 290评论 0 0
  • Some of us get dipped in flat, some in satin, some in glo...
    我想去迪拜阅读 387评论 0 0
  • 做过生意的都知道,现在的生意是越来越难做。 为什么呢?小编给大家分析一下。 第一,互联网的冲击。虽然现在是互联网的...
    与自己干杯阅读 1,367评论 0 0