2015-03-28 18 views
5

Şu anda (28 Mart 2015): Hızlı bir şekilde istikrarlı bir sıralama kullanmak istiyorsam, NSArray ve sortWithOptions'u kullanmalı mıyım yoksa kendi sabit sıralamamı Swift'e insertion sort gibi yazmalı mıyım? Apple Swift docs numaralı belgede sorted'un kararlı olmadığını görüyorum.Swift Stable Sırala?

Example of stable sort in NSMutableArray:

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

Objective-C kullanmadan veya kendi yazmayı bile daha Swift bana diğer kullanılabilir başka bir seçenek eksik? @Michael belirttiği gibi

+0

evet .. ayrıca nesnel-c işlevini çağıran bir hızlı sarmalayıcı yazabilirsiniz - eğer gerçekten bir tane yoksa .. – Michael

+0

elbette! Beynim osurdu. Bir cevap ver ve ben yeşil onay işareti yapacağız, Michael. :) – finneycanhelp

+2

tamam ........... :) – Michael

cevap

0

, tek "objektif-c işlevini çağıran bir hızlı-sarmalayıcı yazabilirsiniz" senin Swift sarıcı yaklaşıma ek olarak

0

C mergesort: işlevini kullanabilirsiniz

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"] 

veya işler daha genel hale getiren Saf Swift yaklaşım yazın: (. Bu benim mütevazı ve basit bir yaklaşımdır, şüphesiz diğerleri optimize edebilirsiniz)

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"]