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