On Tue, Jun 28, 2016 at 9:58 PM, Erica Sadun <[email protected]> wrote:
> Most everyone is doing two passes, one to get the minimum value, another
> to get its index.
> I aesthetically prefer using enumerate to do both at once.
>
> -- E
>
Makes sense. Here’s a revision. It’s not as simple, but it does just one
pass through the array:
func selectionSort(_ array: [Int]) -> [Int] {
guard let first = array.first else { return [] }
let (index, minValue) = array.enumerated().reduce((0, first)) { (carry,
item) in
if item.element < carry.1 { return item } else { return carry }
}
let ranges = [0..<index, index.advanced(by: 1)..<array.endIndex]
return [minValue] + selectionSort(ranges.flatMap { array[$0] })
}
~Dan
_______________________________________________
swift-users mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-users