排序数组以在均匀之前获得赔率

时间:2016-08-18 08:26:16

标签: swift

给定一个数组然后对其进行排序以使得在均匀之前出现赔率。 所以我在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
    }
}   

4 个答案:

答案 0 :(得分: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}中)作为指向两个给定结果数组之一的索引。 E.g。

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 :(得分:4)

受到Hoa答案的启发,这是一种排序方法,可确保您获得&#34; here&#34;。结果,在那之前你将拥有所有奇数值。在每个组中,值将被排序。

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 :(得分:3)

您可以在swift中使用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
    }
}

答案 3 :(得分: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
}