【发布时间】:2015-02-23 17:29:20
【问题描述】:
我写了一个递归的mergeSort函数:
func mergeSort<T: Comparable>(inout array: [T]) {
if array.count <= 1 {
return
}
var leftSlice = [T](array[0..<array.count / 2])
var rightSlice = [T](array[array.count / 2...array.endIndex - 1])
mergeSort(&leftSlice)
mergeSort(&rightSlice)
array = merge(leftSlice, rightSlice)
}
func merge<T: Comparable>(var left: [T], var right: [T]) -> [T] {
var mergedValues = [T]()
while !left.isEmpty && !right.isEmpty {
mergedValues.append(left.first! < right.first! ? left.removeAtIndex(0) : right.removeAtIndex(0))
}
if !left.isEmpty {
mergedValues += left
} else if !right.isEmpty {
mergedValues += right
}
return mergedValues
}
现在,由于merge() 应该只被mergeSort() 使用,我将它放在mergeSort() 内,因此将merge() 设为nested function:
func mergeSort<T: Comparable>(inout array: [T]) {
func merge<T: Comparable>(var left: [T], var right: [T]) -> [T] {
var mergedValues = [T]()
while !left.isEmpty && !right.isEmpty {
mergedValues.append(left.first! < right.first! ? left.removeAtIndex(0) : right.removeAtIndex(0))
}
if !left.isEmpty {
mergedValues += left
} else if !right.isEmpty {
mergedValues += right
}
return mergedValues
}
if array.count <= 1 {
return
}
var leftSlice = [T](array[0..<array.count / 2])
var rightSlice = [T](array[array.count / 2...array.endIndex - 1])
mergeSort(&leftSlice)
mergeSort(&rightSlice)
array = merge(leftSlice, rightSlice)
}
【问题讨论】:
标签: swift generics nested mergesort nested-generics