Swiftの標準ライブラリには数多くのアルゴリズムが用意されていますが、その中で最も頻繁に使われているものの1つはソートであると言えるでしょう。
そんなSwiftのソートアルゴリズムですが、具体的にどのようなアルゴリズムが採用されているかご存知でしょうか。 また、ソートアルゴリズムの重要な指標である時間計算量、空間計算量、安定性はどのような特徴を持っているでしょうか。
もし知らなければ、知っておいて損はないでしょう。5分で解説します。
Takanori HirobeSwiftͷιʔτΞϧΰϦζϜͷಛΛ5Ͱ͖ͪΜͱΔiOSDC 2021
View Slide
ͲΜͳΞϧΰϦζϜΛ͍ͬͯΔͷ͔
ͲΜͳΞϧΰϦζϜΛ͍ͬͯΔͷ͔🤔
Timsort ͱݺΕΔΞϧΰϦζϜΛ͍ͬͯΔ
Timsortͱ؆୯ͳ֓ཁ
Timsortͱ؆୯ͳ֓ཁ• 2002ʹTim PetersʹΑͬͯPythonͷιʔτΞϧΰϦζϜͱ࣮ͯ͠͞Εͨ
Timsortͱ؆୯ͳ֓ཁ• 2002ʹTim PetersʹΑͬͯPythonͷιʔτΞϧΰϦζϜͱ࣮ͯ͠͞Εͨ• SwiftͰSwift 5.0(ABI҆ఆԽͷλΠϛϯά)͔Β࠾༻͞Ε͍ͯΔ
Timsortͱ؆୯ͳ֓ཁ• 2002ʹTim PetersʹΑͬͯPythonͷιʔτΞϧΰϦζϜͱ࣮ͯ͠͞Εͨ• SwiftͰSwift 5.0(ABI҆ఆԽͷλΠϛϯά)͔Β࠾༻͞Ε͍ͯΔ• Swift 5.0ະຬͰҟͳΔΞϧΰϦζϜ͕ΘΕ͍ͯͨ
Timsortͱ؆୯ͳ֓ཁ• 2002ʹTim PetersʹΑͬͯPythonͷιʔτΞϧΰϦζϜͱ࣮ͯ͠͞Εͨ• SwiftͰSwift 5.0(ABI҆ఆԽͷλΠϛϯά)͔Β࠾༻͞Ε͍ͯΔ• Swift 5.0ະຬͰҟͳΔΞϧΰϦζϜ͕ΘΕ͍ͯͨ• ༏ΕͨੑೳΛ͍࣋ͬͯͯɺRustJavaͳͲͰ࠾༻͞Ε͍ͯΔ
ΞϧΰϦζϜͷੑೳ
ΞϧΰϦζϜͷੑೳ• ͞• ҆ఆੑ• ϝϞϦ༻ྔ
͞
͞• ͍ʂ
͞• ͍ʂ• Ҏ্ɻ
͞• ͍ʂ• Ҏ্ɻ• ͞ʹ͍͍ͭͯͯͨ͠Β5Ͱશ͘Γͳ͍
ιʔτΞϧΰϦζϜͱ҆ఆੑ
҆ఆੑྫΛͬͯߟ͑Δ
ਤʹ͢Δͱ
value
ιʔτͰ͖ͨʂʂ
҆ఆੑʁ
҆ఆͳιʔτͱෆ҆ఆͳιʔτ
҆ఆͳιʔτ
҆ఆͳιʔτιʔτલ ιʔτޙ
҆ఆͳιʔτvalue͕ಉ͡ιʔτલ ιʔτޙ
҆ఆͳιʔτvalue͕ಉ͡value͕ಉ͡ͰલޙͷҐஔ͕ؔอଘ͞ΕΔ੨ ԫ ੨ ԫ
ෆ҆ఆͳιʔτιʔτલ ιʔτޙ
ෆ҆ఆͳιʔτvalue͕ಉ͡ԫ ੨੨ ԫ ιʔτલ ιʔτޙ
ෆ҆ఆͳιʔτvalue͕ಉ͡ԫ ੨੨ ԫ ಉ͡valueಉ࢜ͷલޙͷҐஔ͕ؔอଘ͞Εͳ͍
ͳͥ҆ఆੑ͕ॏཁͳͷ͔
Swiftͷྺ࢙తͳࣄ
Swiftͷྺ࢙తͳࣄ• Timsort҆ఆͳιʔτ
Swiftͷྺ࢙తͳࣄ• Timsort҆ఆͳιʔτ• Swift 5.0Ҏ߱
Swiftͷྺ࢙తͳࣄ• Timsort҆ఆͳιʔτ• Swift 5.0Ҏ߱• Swift 5.0ະຬͰIntrosort͕ΘΕ͍ͯͨ
Swiftͷྺ࢙తͳࣄ• Timsort҆ఆͳιʔτ• Swift 5.0Ҏ߱• Swift 5.0ະຬͰIntrosort͕ΘΕ͍ͯͨ• Introsortෆ҆ఆͳιʔτ
Swiftͷྺ࢙తͳࣄ• Timsort҆ఆͳιʔτ• Swift 5.0Ҏ߱• Swift 5.0ະຬͰIntrosort͕ΘΕ͍ͯͨ• Introsortෆ҆ఆͳιʔτ• SwiftͷόʔδϣϯʹΑͬͯιʔτͷ҆ఆੑ͕ҟͳΔ
Swiftͷྺ࢙తͳࣄ• Timsort҆ఆͳιʔτ• Swift 5.0Ҏ߱• Swift 5.0ະຬͰIntrosort͕ΘΕ͍ͯͨ• Introsortෆ҆ఆͳιʔτ• SwiftͷόʔδϣϯʹΑͬͯιʔτͷ҆ఆੑ͕ҟͳΔ• ιʔτ݁Ռ͕ҟͳΔՄೳੑ͕͋Δ
࠷ޙʹҙ
࠷ޙʹҙ• υΩϡϝϯτͰ҆ఆੑʹ͍ͭͯอো͍ͯ͠ͳ͍ͷͰҙ• ҆ఆੑʹ͍ͭͯ Implementation Detail (࣮ʹґଘ)ͱ͍͏ѻ͍"The sorting algorithm is not guaranteed to be stable."https://developer.apple.com/documentation/swift/array/1688499-sort
ϝϞϦ༻ྔ
TimsortͷϝϞϦ༻ྔ• ιʔτΞϧΰϦζϜ͝ͱʹϝϞϦ༻ྔҟͳΔ
TimsortͷϝϞϦ༻ྔ• ιʔτΞϧΰϦζϜ͝ͱʹϝϞϦ༻ྔҟͳΔ• Timsortɺιʔτ͞ΕΔྻͷͷେ͖͞ͷϝϞϦΛ֬อ͢Δ• ͋͘·Ͱཧ্ͷ࠷େͷͳͷͰɺ࣮ࡍͬͱগͳ͍• ͨͩ͠ɺશϥϯμϜͳྻϝϞϦ༻ྔ͕େ͖͘ͳΔ͕͋Δ
TimsortͷϝϞϦ༻ྔ
TimsortͷϝϞϦ༻ྔҰॠ͚ͩϝϞϦ༻ྔ͕૿͑Δ
TimsortͷϝϞϦ༻ྔҰॠ͚ͩϝϞϦ༻ྔ͕૿͑Δී௨ͷΞϓϦͰʹͳΔ͜ͱͳ͍ͣ
·ͱΊ• ݱࡏͷSwiftͰΘΕ͍ͯΔTimsort҆ఆੑ࣌ؒܭࢉྔͷ؍Ͱɺ༏ΕͨੑೳΛ͍࣋ͬͯΔ• ྺ࢙తࣄʹΑΓɺSwift 5.0ͷલޙͰιʔτ݁Ռ͕มΘΔՄೳੑ͕͋Δ• Timsortɺ࠷େͰݩͷྻͷͷϝϞϦΛ֬อ͢ΔՄೳੑ͕͋Δ
ࣗݾհ• Takanori Hirobe / ኍ෦وಙ• 4ࡀ͝Ζ͔Βͣͬͱؔʹࡏॅ• @taka1068• Twitter, GitHub, Qiita
Further Reading• ຊޠࢿྉ• https://tech.preferred.jp/ja/blog/tim-sort/• ӳޠࢿྉ• https://swiftrocks.com/introsort-timsort-swifts-sorting-algorithm• ΞϧΰϦζϜมߋͷPull request• https://github.com/apple/swift/pull/19717
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠