2016-08-18 2 views
4

배열을 제공 한 다음 정렬하여 확률이 높아지기 전에 확률을 정렬하십시오. 그래서 Swift에서 아래와 같은 방법을 썼습니다. 나는이 방법에서 잘못된 것을 볼 수는 없지만, 논리가 옳지 않다. 누구나 내 인생을 구할 단서를 줄 수 있습니다. 미리 감사드립니다. 당신은 신속에 sort 기능을 사용할 수 있습니다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'의 0'instead 감지하는'% 2를 사용한다는 것을 보인다. –

+0

@ Hoa, 대단히 감사합니다! 나는 끔찍한 초등학교 실수를했고 나는 오랫동안 발견하지 않았다! 고맙습니다!!!! –

답변

4

여기

코드입니다 대안으로, 배열에서 두 개의 filter 조작으로 확률과 짝수를 분리 할 수 ​​있습니다. 단순히 배열 이전에도 값 배열이 당신을하지 않는 한 실제로 문제이어야한다

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] 

또는 '으로 홀수 값으로이 개 결과 배열에 가입 몇 가지 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

,이 같은 :

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 
} 

이 확률을 분류하고 분류하려면 고르게 : AS를

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이다, 나보다 훨씬 좋네요 보이지만. 퍼포먼스가 끝나면이 코드를 사용할 수 있습니다. 왜냐하면 배열을 한 번만 돌기 때문에 두 번 빨라야하기 때문입니다.

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

관련 문제