在我的 Julia 课程中,我们看到了冒泡排序的基本实现:
function bubble_sort!(a)
n = length(a)
for i in 1:n-1
for j in 1:n-i
if a[j] > a[j+1]
a[j], a[j+1] = a[j+1], a[j]
end
end
end
return a
end
作为练习,我试图将实际的排序部分压缩为单行条件,如下所示:
function bubble_sort_oneline!(a::Vector)
n = length(a)
for i in 1:n-1
for j in 1:n-i
(a[j] > a[j+1]) ? a[j], a[j+1] = a[j+1], a[j] : nothing
end
end
return a
end
但是,Julia 返回语法错误:“‘?’中需要冒号”表达。在我看来,用逗号分隔分配会导致一些问题,但我不知道如何解决它。我怎样才能做到这一点?
你可以写
a[j] > a[j+1] ? begin a[j], a[j+1] = a[j+1], a[j] end : nothing
,或者因为你不需要三元组的第三部分,所以使用 &&
代替:
julia> function bubble_sort!(a)
n = length(a)
for i in 1:n-1, j in 1:n-i
a[j] > a[j+1] && begin a[j], a[j+1] = a[j+1], a[j] end
end
return a
end
bubble_sort! (generic function with 1 method)
julia> bubble_sort!(rand(1:99, 10))'
1×10 adjoint(::Vector{Int64}) with eltype Int64:
4 18 24 25 28 56 87 89 92 95
如果没有逗号,您可以使用括号代替开始/结束,但解析器认为
a[j] > a[j+1] && (a[j], a[j+1] = a[j+1], a[j])
可能是 NamedTuple 的语法,并说 invalid named tuple element "a[j]"
。
julia> let x = 3
rand()>0.1 && (x = 4)
@show x; nothing
end
x = 4
不过,原著可能更容易阅读。