MergeSort,归并排序

复制代码
package _Sort.Algorithm

/**
 * https://www.geeksforgeeks.org/merge-sort/
 * https://www.cnblogs.com/chengxiao/p/6194356.html
 * best/worst/average Time complexity are O(nlogn), Space complexity is O(n), stable
 * # is Divide and Conquer algorithm
 * Basic idea
 * 1. find the middle point to divide the array into two halves;
 * 2. Call MergeSort for first halves;
 * 3. Call MergeSort for second halves;
 * 4. Merge two halves;
 * */
class MergeSort {

    fun sortArray(array: IntArray): IntArray {
        //create temp array first, avoid create temp in recursion
        val tempArray = IntArray(array.size)
        val left = 0
        val right = array.size - 1
        sort(array, left, right, tempArray)
        //printArray(array)
        return array
    }

    private fun printArray(array: IntArray) {
        for (item in array) {
            print("$item,")
        }
    }

    private fun sort(array: IntArray, left: Int, right: Int, tempArray: IntArray) {
        if (left < right) {
            val mid = (left + right) / 2
            sort(array, left, mid, tempArray)
            sort(array, mid + 1, right, tempArray)
            merge(array, left, mid, right, tempArray)
        }
    }

    private fun merge(array: IntArray, left: Int, mid: Int, right: Int, tempArray: IntArray) {
        var i = left
        var j = mid + 1
        var k = 0
        //merge the sub arrays
        while (i <= mid && j <= right) {
            if (array[i] <= array[j]) {
                tempArray[k] = array[i]
                i++
            } else {
                tempArray[k] = array[j]
                j++
            }
            k++
        }

        //add remaining elements of L[]
        while (i <= mid) {
            tempArray[k] = array[i]
            i++
            k++
        }
        //add remaining elements of R[]
        while (j <= right) {
            tempArray[k] = array[j]
            j++
            k++
        }

        //copy temp into original
        k=0
        for (i in left until right+1) {
            array[i] = tempArray[k++]
        }
    }
}
复制代码

 

posted @   johnny_zhao  阅读(166)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2019-03-26 1. Two Sum
点击右上角即可分享
微信分享提示