2016-08-18 63 views
4

給定一個數組,然後對它進行排序以在賠率出現之前進行賠率出現。 所以我在Swift中編寫了如下的方法。在這種方法中我看不出任何錯誤,但是邏輯是不正確的。任何人都可以給我一個線索將拯救我的生命。 在此先感謝!對排列數組進行排序以在賠率之前產生賠率

下面的代碼:

class OddsBeforeEvens { 
    func sortArrayOddsBeforeEvens(var array: [Int]) -> [Int]? { 
     if array.isEmpty { return nil } 
     let length = array.count 
     var begin = 0 
     var end = length - 1 
     var temp: Int 
     while (begin < end) { 
      while (begin < end && array[begin]/2 != 0) { 
       begin += 1 
      } 
      while (begin < end && array[end]/2 == 0) { 
       end -= 1 
      } 
      if (begin < end) { 
       temp = array[begin] 
       array[begin] = array[end] 
       array[end] = temp 
      } 
     } 

     return array 
    } 
} 
+2

您是否嘗試*調試*代碼? –

+1

看起來您必須使用'%2!= 0'而不是'/ 2!= 0'來檢測數字是奇數還是偶數。 –

+0

@ Hoa,非常感謝!我犯了一個可怕的小錯誤,我很久沒有找到!謝謝!!!! –

回答

4

作爲或者,您可以通過對陣列上的兩個filter操作將賠率和偶數分開,並直接合並兩個結果陣列,奇值的偶數值數組

func sortArrayOddsBeforeEvens(array: [Int]) -> [Int] { 
    let odds = array.filter{ $0 % 2 != 0 } 
    let evens = array.filter{ $0 % 2 == 0 } 
    return odds + evens 
}  

print(sortArrayOddsBeforeEvens([1,4,3,7,8,11,12,27,18])) 
// [1, 3, 7, 11, 27, 4, 8, 12, 18] 

或者,

func sortArrayOddsBeforeEvens(array: [Int]) -> [Int] { 
    return array.filter{ $0 % 2 != 0 } + array.filter{ $0 % 2 == 0 } 
}  

print(sortArrayOddsBeforeEvens(array: [1,4,3,7,8,11,12,27,18])) 
// [1, 3, 7, 11, 27, 4, 8, 12, 18] 

這不應該是一個問題,在實踐中,除非你事先陣列重新編寫一些HPC應用程序(在這種情況下,Swift可能不是最佳選擇語言),但是如果您出於某種原因擔心性能會下降。在上面的兩個filter操作中,可以使用$0 % 2(始終在集合{0, 1}中)的結果直接作爲指向兩個給定結果數組之一的索引。例如。

func sortArrayOddsBeforeEvens(array: [Int]) -> [Int] { 
    var arr: [[Int]] = [[],[]] 
    array.forEach { arr[$0 % 2].append($0) } 
    return arr[1] + arr[0] 
} 

print(sortArrayOddsBeforeEvens([1,4,3,7,8,11,12,27,18])) 
// [1, 3, 7, 11, 27, 4, 8, 12, 18] 
+1

這太棒了!我會記住它!感謝你的分享! –

3

您可以迅速使用sort功能,像這樣:

let arr = [1,3,4,5,9,10,50,2,8,12,34,53,88,23] 

let arrSorted = arr.sort { (a, b) -> Bool in 
    return a % 2 != 0 
} 

得到分類賠率和分類找齊:

let arrSorted = arr.sort { (a, b) -> Bool in 
    if (a % 2 != 0) { 
     if (b % 2 != 0) { 
      return a < b 
     } else { 
      return true 
     } 
    } else { 
     return a < b 
    } 
} 
+0

這可能是偶然的,但你的比較函數並不是一個「嚴格的弱排序」,如下所示:https://developer.apple.com/library/ios/documentation/Swift/Reference/Swift_MutableCollectionType_Protocol/index.html#// apple_ref/swift/intfm/MutableCollectionType/s:FEsPs21MutableCollectionType4sortFFTWx9Generator7Element_WxS0_S1 ___ SbGSaWxS0_S1___ –

+0

好的,謝謝您的評論! –

4

受到Hoa答案的啓發,這裏有一個排序方法可以確保你的「strict weak ordering」。因此,在這之前你會得到所有奇數值。在每個組內,值將被排序。

let arr = [1,3,4,5,9,10,50,2,8,12,34,53,88,23] 

let arrSorted = arr.sort { (a, b) -> Bool in 
    // If a and b are both even (or odd), we simply compare them 
    if a % 2 == b % 2{ 
     return (b>a) 
    } 
    // Else, we just put the odd values first 
    return a % 2 != 0 
} 

這個例子給出了這樣的結果:

[1, 3, 5, 9, 23, 53, 2, 4, 8, 10, 12, 34, 50, 88] 
2

雖然@dfri的解決方案效果很好,看起來比我更漂亮,性能爲2n,也就是說,通過過濾器的 循環陣列的兩倍。如果你是在性能之後,你可以使用這個代碼,因爲它只循環一次數組,所以它應該快兩倍。

func sortArrayOddsBeforeEvens(array: [Int]) -> [Int] { 
    var odds = [] 
    var evens = [] 
    for int in array { 
     if int % 2 == 0 { 
      evens.append(int) 
     } else { 
      odds.append(int) 
    } 
    return odds + evens 
} 
+0

這不會將數字從最小到最大排序。 – WMios

+1

OP – Yannick

+0

沒有要求我這樣做的意思是,當它不做同樣的事情時,你當然會更快。不是想說你做錯了 - 這實際上可能正是OP正在尋找的東西。 – WMios