[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
}