Swift稳定sorting?

在这个时候(2015年3月28日):如果我想在swift中使用稳定的sorting,我必须使用NSArraysortWithOptions或者在Swift中编写自己的稳定sorting,比如插入sorting ? 我在Apple Swift文档中看到sorted不稳定。

在NSMutableArray中稳定sorting的例子 :

 [array sortWithOptions:NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2) { return [obj1 compare:obj2]; }]; 

除了使用Objective-C或写我自己的sorting之外,我是否错过了Swift中可用的另一个选项?

正如@迈克尔所说,可以“写一个快速的包装器,调用目标函数”

除了你的Swift包装器的方法,你可以使用C mergesort:函数

 var array2 = ["mango", "apple", "pear", "apple", "orange", "banana"] mergesort(&array2, array2.count, MemoryLayout<String>.size, { let a = $0.unsafelyUnwrapped.load(as:String.self) let b = $1.unsafelyUnwrapped.load(as:String.self) if a == b { return 0 } else if a < b { return -1 } else { return 1 } }) print(array2) // ["apple", "apple", "banana", "mango", "orange", "pear"] 

或者写一个Pure Swift方法,使其更通用:

 var array = ["mango", "apple", "pear", "banana", "orange", "apple", "banana"] enum SortType { case Ascending case Descending } struct SortObject<T> { let value:T let startPosition:Int var sortedPosition:Int? } func swiftStableSort<T:Comparable>(array:inout [T], sortType:SortType = .Ascending) { var sortObjectArray = array.enumerated().map{SortObject<T>(value:$0.element, startPosition:$0.offset, sortedPosition:nil)} for s in sortObjectArray { var offset = 0 for x in array[0..<s.startPosition] { if s.value < x { offset += sortType == .Ascending ? -1 : 0 } else if s.value > x { offset += sortType == .Ascending ? 0 : -1 } } for x in array[s.startPosition+1..<array.endIndex] { if s.value > x { offset += sortType == .Ascending ? 1 : 0 } else if s.value < x { offset += sortType == .Ascending ? 0 : 1 } } sortObjectArray[s.startPosition].sortedPosition = offset + s.startPosition } for s in sortObjectArray { if let sInd = s.sortedPosition { array[sInd] = s.value } } } swiftStableSort(array: &array, sortType:.Ascending) // ["apple", "apple", "banana", "banana", "mango", "orange", "pear"] swiftStableSort(array: &array, sortType:.Descending) // ["pear", "orange", "mango", "banana", "banana", "apple", "apple"] 

(这是我的谦虚和直接的方法,无疑其他人可以优化。)