I wrote a recursive mergeSort
function:
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
}
Now, since merge()
is only supposed to be used by mergeSort()
I placed it inside of mergeSort()
, therefore making merge()
a 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)
}
Now the first version works fine, but the second one doesn't.
How can that be?