LoginSignup
4
1

More than 5 years have passed since last update.

Swiftのsortが、要素数が増えると安定ではなくなる話

Last updated at Posted at 2016-12-17

はじめに

タイトル通り。これではまった。

調べたこと

コード

以下のコードで、sortの挙動を調べた。
わかりやすいように、sortの処理はつなげて書かずに分割してある。


typealias Pair = (Int, Int)

// 要素数21個の場合
let array1 = (0 ... 20).map { i in
    Pair(i / 5, i)
}

// tupleの2つめの要素でsortしてから
let sorted1 = array1.sorted { (p1, p2) in
    p1.1 < p2.1
}

// tupleの1つめの要素でsort
let sorted12 = sorted1.sorted { (p1, p2) in
    p1.0 < p2.0
}

print(sorted12)

// 要素数501個の場合も同じことをする
let array2 = (0 ... 500).map { i in
    Pair(i / 5, i)
}

let sorted2 = array2.sorted { (p1, p2) in
    p1.1 < p2.1
}

print(sorted2)

let sorted22 = sorted2.sorted { (p1, p2) in
    p1.0 < p2.0
}

print(sorted22)

結果

要素数21の場合は安定なのに、要素数501の場合は安定ではなくなっている様子がおわかりいただけるだろうか。

スクリーンショット 2016-12-18 1.14.54.png

原因

未調査。Swiftのコードを読もう。

最後に

安定じゃないと困るようなsortをするときは気をつけよう。私は自前でマージソートを実装して乗り切った。

4
1
10

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1