犬も歩けばエンジニアになる

プログラミングや数学や物理に関する技術メモ

Julia - リストをソートする方法

Juliaのソート関数

Juliaで作成したリストにはビルトイン関数のsortが使えます。 sort()はリストを引数にとり、ソートされたリストをreturnします。 エクスクラメーションマーク(!)をつけたsort!()は引数として渡すリスト自体を変更します。

list = [5,-6,-2,1,7,3,-4,9,-8]
sort!(list)
println(list)                         #結果 [-8, -6, -4, -2, 1, 3, 5, 7, 9]


ソートはオプショナル引数として、rev、lt、by、algを指定することができます。

revはtrueをわたすことで逆順にソートします。

list = [5,-6,-2,1,7,3,-4,9,-8]
sort!(list, rev=true)
println(list)                          #結果 [9, 7, 5, 3, 1, -2, -4, -6, -8]


ltに関数を渡すことで、その関数を自前のisless関数として使うことができます。 isless関数は二つの要素を引数にとり、true/falseをreturnします。falseが返された場合、二つの要素は位置が入れ替えられ、trueの場合はされません。

以下の例では、自前のisless関数を作ることにより、文字列のリストを短い→長い順にソートします。

#自前のisless関数
function comp(a, b)
    if length(a) < length(b)
        return true #文字列aが文字列bより短ければtrueを返す。
    end
    return false  #falseを返す
end

list = ["apple", "julia lang", "car", "physics"]    #文字列のリスト
sort!(list, lt= comp)       #comp関数を自前のltに指定
println(list)      #結果 ["car", "apple", "physics", "julia lang"]

無名関数(Anonymous function)を使えばコードが短くなります。

sort!(list, lt= (a,b)->length(a) < length(b))       #無名関数を引数として渡す


byはリストの要素一つ一つに引数となる関数が実行された状態でソートが実行されます。

list = [5,-6,-2,1,7,3,-4,9,-8]
sort!(list, by= x->x^2)               #リストの要素の二乗を比較してソート
println(list)                           #結果 [1, -2, 3, 4, 5, -6, -7, -8, 9]

byを使ってタプルをソートする例 *Juliaは1-based inidexing

list = [(3, "three"), (2, "two"), (4, "four"), (1, "one")];
sort!(list, by =x -> x[1] )           #タプルの第一要素を比較してソート
println(list)                               #結果  [(1, "one"), (2, "two"), (3, "three"), (4, "four")]


algでソートのアルゴリズムを指定することができます。 アルゴリズムにはQuickSort、InsertionSort、MergeSortなどが指定できます。