Hi Tod, thanks for sharing your ideas. Much appreciated! Feel free to take a look at my playground where I explore many other alternative implementations.
https://github.com/adrfer/Sort/tree/swift-3 Best, — A > On Jun 30, 2016, at 11:32 AM, Tod Cunningham via swift-users > <[email protected]> wrote: > > This was bugging me last night, as I still didn’t like the solution. What > about something like: > > func selectionSort(_ originalArray: [Int]) -> [Int] { > var array = originalArray > for index in 0..<array.count { > let minIndex = array.indices.clamped(to: > index..<x.count).min(isOrderedBefore: { array[$0] < array[$1] }) > if index != minIndex { > swap(&array[index], &array[minIndex!]) > } > } > return array > } > > > > On 6/29/16, 7:12 PM, "[email protected] on behalf of Tod > Cunningham via swift-users" <[email protected] on behalf of > [email protected]> wrote: > > Was trying to using some functional programming concepts while also using as > little memory as possible. The big advantage of using a selections sort is > that it sorts w/o having to allocation additional memory. This still > violates that, but it’s closer. :) > > func selectionSort(_ array: inout [Int]) { > for index in 0..<array.count { > // .1 is value .0 is the index on the enumeration > let minElement = > array.enumerated().dropFirst(index).min(isOrderedBefore: { $0.1 < $1.1 } ) > if index != minElement!.0 { > swap(&array[index], &array[minElement!.0]) > } > } > } > > or using recursion: > > func selectionSort(_ array: inout [Int], index: Int = 0) { > if index < array.count { > // .1 is value .0 is the index on the enumeration > let minElement = array.indexed().dropFirst(index).min(isOrderedBefore: > { $0.1 < $1.1 } ) > if index != minElement!.0 { > swap(&array[index], &array[minElement!.0]) > } > selectionSort(&array, index: index+1) > } > } > > > > On 6/28/16, 10:58 PM, "[email protected] on behalf of Erica Sadun > via swift-users" <[email protected] on behalf of > [email protected]> wrote: > >> >> On Jun 28, 2016, at 8:18 PM, Dan Loewenherz via swift-users >> <[email protected]> wrote: >> >> I’m not sure if you wanted to stick with the pure functional approach, but >> here’s an alternative that uses Range<Int> to take care of most of the work. >> >> func selectionSort(_ array: [Int]) -> [Int] { >> guard let minValue = array.min(), let index = array.index(of: minValue) >> else { >> return [] >> } >> >> let ranges = [0..<index, index.advanced(by: 1)..<array.endIndex] >> return [minValue] + selectionSort(ranges.flatMap { array[$0] }) >> } >> > > 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 > > _______________________________________________ > swift-users mailing list > [email protected] > https://lists.swift.org/mailman/listinfo/swift-users > > > _______________________________________________ > swift-users mailing list > [email protected] > https://lists.swift.org/mailman/listinfo/swift-users > > > _______________________________________________ > swift-users mailing list > [email protected] > https://lists.swift.org/mailman/listinfo/swift-users _______________________________________________ swift-users mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-users
