[Swift 3.0] Fundamental & Algorithm

[Swift Algorithm] Merge sort

2016-07-14  本文已影响55人  sunlitamo
func mergeSort(array:[Int])->[Int]{
    
    //确保最终将count 为N 的数列分解成N个count为一个的数列群
    //本条确认条件即为退出recursive call 的一个基准条件
    guard array.count > 1 else { return array }
    
    //将count > 1的数列 从中间一分为二
    let midIdx = array.count / 2
    
    //recursive call
    let leftArray = mergeSort(Array(array[0 ..< midIdx]))
    let rightArray = mergeSort(Array(array[midIdx ..< array.count]))
    
    // 合并数列的核心代码
    return merge(leftArray,rightArr: rightArray)
}

func merge(leftArr:[Int],rightArr:[Int]) -> [Int]{
    var leftIdx = 0
    var rightIdx = 0
    var sorted = [Int]()
    
    while leftIdx < leftArr.count && rightIdx < rightArr.count{
    
        let nLeft = leftArr[leftIdx]
        let nRight = rightArr[rightIdx]
       //在不超过各自数列范围的情况下,进行 1对1 对比
       //数字小的一方将被优先排列到最终数组前列,同时该数列的游尺加1,然后继续进行双方的 1对1 对比
        if nLeft < nRight {
            sorted.append(nLeft)
            leftIdx += 1
        }
        else if nLeft > nRight {
            sorted.append(nRight)
            rightIdx += 1
        }
        else {
            //如果双方
            sorted.appendContentsOf([nLeft,nRight])
            
            leftIdx += 1
            rightIdx += 1
        }
    }
    while leftIdx < leftArr.count{
        sorted.append(leftArr[leftIdx])
        leftIdx += 1
    }
    
    while rightIdx < rightArr.count {
        sorted.append(rightArr[rightIdx])
        rightIdx += 1
    }
    
    return sorted

}

上一篇下一篇

猜你喜欢

热点阅读