2016-08-18 6 views
4

配列を与えて、それをソートして、オッズが出る前にオッズを出す。 私はSwiftに以下のような方法を書いた。私はこの方法で何か間違ったことを見ることはできませんが、論理はちょうど正しくありません。 誰でも私の人生を保存する手がかりを与えることができます。 ありがとうございます!ここでevensの前にオッズを作るために配列を並べ替える

はコードです:

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

を代わりに、オッズと偶数をアレイ上の2つの演算で分けることができます。単に配列前でも値の配列。これは、あなたの場合を除き、実際に問題があってはならない

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] 

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] 

または、」に奇数値を持つ2つの結果の配列を、参加いくつかのHPCアプリケーションを書き直してください(Swiftは最適な言語ではありません)。何らかの理由でパフォーマンスが心配されている場合は、上記の2つのfilter操作を使用すると、$0 % 2(常にセット{0, 1})の結果を、指定された2つの結果配列の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

、ここではあなたに「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で、私よりもはるかに良く見えますが。パフォーマンスが終わったらこのコードを使用することができます。なぜなら、アレイを一度ループするだけなので、2倍の速さでなければならないからです。

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

関連する問題