๐ฌ ์์ํ๋ฉฐ
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๊ณต๋ถํ๋ฉด์ sort()์ ๋ํด์ ๊ถ๊ธํด์ก๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋ฉํ
์คํธ์์ ์ ๋ ฌ์๊ณ ๋ฆฌ์ฆ๋ ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ๊ถ๊ธํด์ก๋ค. ์ฝํ
์์๋ ๋๋ถ๋ถ ์ ๋ ฌ์ ์ํ ๋ Sort() ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ์ ๋ ฌ์ํค๊ธฐ ๋๋ฌธ์ด๋ค. ๋จ์ํ ์๊ณ ๋์ด๊ฐ์ผ๋ง ํ๋ ๊ฐ๋
์ธ๊ฑด์ง, ์๋๋ฉด ๊ตฌํ๊น์ง ๋ชจ๋ ์๋ฒฝํ๊ฒ ํ ์ค ์์์ผํ๋๊ฑด์ง?
โซ๏ธ Swift์ sort() ๋ด๋ถ ์๊ณ ๋ฆฌ์ฆ ๋ณํ
โช๏ธ 2018๋ ์ด์
Swift๋ 2018๋ sort์ ๋ด๋ถ ์๊ณ ๋ฆฌ์ฆ์ด ๊ต์ฒด๊ฐ ๋๋ค. ์๋๋, introsort๋ฅผ ์ฌ์ฉํ์๋ค.
introSort
introsort๋ ํ๊ท ์ ์ผ๋ก ๋น ๋ฅธ ์ฑ๋ฅ์ ๋ด๋ฉด์ ์ต์
์ ์ํฉ์์๋ ์ ์ง์ ์ผ๋ก ์ต์ ํ๋ ์ฑ๋ฅ์ ์ ๊ณตํ๋ ํ์ด๋ธ๋ฆฌ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. C++ STL์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ์ ๋ ฌ ํจ์์ด๋ค.
intro ์ ๋ ฌ์ ํ์ ๋ ฌ, ํต์ ๋ ฌ, ์ฝ์
์ ๋ ฌ๋ก ์ด๋ฃจ์ด์ ธ์๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ํต์ ๋ ฌ์ ์ฌ์ฉํ๋๋ฐ ํต์ ๋ ฌ์ ์ต์
์ ๊ฒฝ์ฐ์ ๋๋ ค์ง๊ฒ ๋๊ณ , ์ด ๋จ์ ์ ๋ณด์ํ ์๊ณ ๋ฆฌ์ฆ์ด ๋ฐ๋ก introSort๋ผ๊ณ ํ ์ ์๊ฒ ๋ค.
์ต์
์ ๊ฒฝ์ฐ ๋จ์ ์ ๋ณด์ํด์ ์ฌ์ฉํ๋ ํ์ด๋ธ๋ฆฌ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๊ธฐ ๋๋ฌธ์ ์ต์
์ ๊ฒฝ์ฐ์๋ ์๊ฐ๋ณต์ก๋ O(nlogn)์ ๋ณด์ฅํ๋ค.
introsort ๋์๋ฐฉ์
- ๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ 16์ดํ์ธ ๊ฒฝ์ฐ๋ผ๋ฉด, ์ฝ์ ์ ๋ ฌ์ ์ฑํํ๋ค.
- ์ ์ฒด ๋ฆฌ์คํธ์ ๋ํด์ ํต์ ๋ ฌ์ ์ํํ๋ค.
- (ํต ์ ๋ ฌ์ ์ต์ ์ ๊ฒฝ์ฐ O(n^2) โ ๋ถํ ํ์๊ฐ ๋ง์์ง๋ฉด ์ฑ๋ฅ์ด ์ ํ, ๋ถํ ํ์๊ฐ ํน์ ์๊ณ์น์ ๋๋ฌํ๋ฉด sort ๋ฐฉ์์ ์ค์์นญ ํ๋ ๋ฐฉ์์ ์ฑํ โ ๊ทธ๋์ ์ต์ ์ ๊ฒฝ์ฐ์๋ ์๊ฐ๋ณต์ก๋๊ฐ O(nlogn)์)
- ์ํ ๋์ค ์ฌ๊ท ํธ์ถ์ ๊น์ด๊ฐ 2logn์ ๋์ด๊ฐ๋ฉด 4๋ฒํญ๋ชฉ(ํ์ ๋ ฌ๋ก ์ค์์นญ)์ผ๋ก ๋์ด๊ฐ๋ค.
- ์ชผ๊ฐ์ง ๋ถ๋ถ ๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ 16์ดํ๋ผ๋ฉด ๊ทธ๋๋ก ๋๋๋ค.
- 16๋ณด๋ค ํฌ๋ฉด, ํด๋น ๋ถ๋ถ ๋ฆฌ์คํธ์ ๋ํด ํ์ ๋ ฌ์ ์ํํ๋ค.
- 3, 4๋ฒ ํญ๋ชฉ์ด ๋ชจ๋ ์๋ฃ๋ ํ, ๋๋ถ๋ถ ์ ๋ ฌ์ด ๋ ์ ์ฒด ๋ฆฌ์คํธ์ ๋ํด์ ์ฝ์ ์ ๋ ฌ์ ์ํํ๋ค.
๋ญ ๋์ถฉ,, ์ด๋ ๊ฒ ์ฌ๋ฌ๊ฐ์ง ์ ๋ ฌ ๋ฐฉ์์ ์ฅ์ ๋ง ๊ณจ๋ผ์ ์ฌ์ฉํ๋ค๊ณ ์๊ณ ์์ด๋ณด์. (์์ง ์ ์ด์ผ ๋์ํ๋ค๋์ง ์ดํด๋ ์๋์ง๋ง,,)
โช๏ธ 2018๋ 10์ ์ดํ
Swift์ sort ์๊ณ ๋ฆฌ์ฆ์ด Timsort๋ก ๊ต์ฒด๋๋ค.
https://github.com/apple/swift/pull/19717
ํด์ํด๋ณด์๋ฉด,
This switches the standard library's sort algorithm from an in-place introsort to use a modified timsort, a stable, adaptive sort that merges runs using a temporary buffer.
ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ in-place introsort์์ ์์ buffer๋ฅผ ์ฌ์ฉํ์ฌ ์คํ์ ๋ณํฉํ๋ ์์ ์ ์ด๊ณ ์ ์์ ์ธ(?) ์ ๋ ฌ์ธ modified timsort๋ฅผ ์ฌ์ฉํ๋๋ก ์ ํํ๋ค.
(in-place sorting์ด๋, ์ ์๋ฆฌ ์ ๋ ฌ์ ์๋ฏธํ๋๋ฐ, ์์๋ฐฐ์ด ํ์ ์์ด ๋ฐฐ์ด ๋ด๋ถ์์ ์ ๋ ฌ์ ํ๋ ๊ฒ์ ์ ์๋ฆฌ์ ๋ ฌ์ด๋ผ๊ณ ํ๋๊ฐ๋ณด๋ค. ์์๋ฐฐ์ด์ด ํ์ํ๋ค๋ฉด, inplace ์ ๋ ฌ์ด ์๋! (์ฐธ๊ณ - https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html)
In addition to maintaining the relative order of equal/non-comparable elements, this algorithm outperforms the introsort on data with any intrinsic structure, such as runs of ascending or descending elements or a significant number of equality collisions.
์ด ์๊ณ ๋ฆฌ์ฆ์ equal / non-comparable ์์๋ค์ ์์๋ฅผ ์ ์งํ ๋ฟ๋ง ์๋๋ผ (stable, ์์ ์ ๋ ฌ์ด๋ผ๋ ๋ป์ธ๊ฑฐ๊ฐ์) ์ค๋ฆ์ฐจ์, ๋ด๋ฆผ์ฐจ์ ์์ ์คํ / equality collisions์ ๊ฐ์ ๊ฒ๋ค์์ introsort๋ฅผ ํจ์ฌ ๋ฅ๊ฐํ๋ค.
๋ญ ์ด์จ๋ , introsort๋ณด๋ค๋ ๋ ์ข์ ์ฑ๋ฅ์ timsort๋ฅผ ์ด์ฉํ๊ฒ๋ ๋ฐ๊ฟจ๋ค๋ ๋ง์ด๋ค. ์โฆ ์ง๊ธ ๋์ ์ถ์ธก์ผ๋ก๋ ํต์ ๋ ฌ, ํ์ ๋ ฌ์ ์ฌ์ฉํ๋ introsort๋ ๋ถ์์ ์ ๋ ฌ์ด๊ธฐ ๋๋ฌธ์ ์์ ์ ๋ ฌ์ ์ฌ์ฉํ๋๋ก ๋ฐ๊ฟจ๋ค! ๊ทธ๋์ ๋ญ ์ด๋ฐ์ด๋ฐ ์ถฉ๋ ์ด๋ฐ๊ฒ์์ ๋ฅ๊ฐํ๋ค. ์ด๋ฐ ๋๋์ฐ ์ธ๊ฒ ๊ฐ์๋ค.
(๋ถ์์ ์ ๋ ฌ / ์์ ์ ๋ ฌ ์ฐธ๊ณ ์๋ฃ https://velog.io/@good159897/์์ -์ ๋ ฌ-VS-๋ถ์์ -์ ๋ ฌ-ํ์ด์ฌ-์๊ณ ๋ฆฌ์ฆ-์ธํฐ๋ทฐ)
โซ๏ธ timsort
โช๏ธ timsort๊ฐ ๋ญ๊น
timsort๋ ์ฝ์ ์ ๋ ฌ๊ณผ ๋ณํฉ์ ๋ ฌ์ ์ฌ์ฉํ๋ ํ์ด๋ธ๋ฆฌ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ด ๋๊ฐ์ง์ ๋ํด์ ๋จผ์ ์์๋ณด์.
Insertion sort (์ฝ์ ์ ๋ ฌ)
์ฝ์
์ ๋ ฌ์ ๋ฐฐ์ด์ ์ผ๋ถ๋ฅผ ์ ๋ ฌ๋ ์ํ๋ก ์ ์งํ๋ฉด์, ๋ค์ ์์๊ฐ ์์ด์ผํ ์์น๋ฅผ ์ดํด๋ณด๋ฉด์ ์ ๋ ฌ์ ์ํํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์๋ ๋ด๊ฐ ์ ์ ๋ฆฌํด๋์์ผ๋, ์ดํด๋ณด์.
https://desert-opossum-095.notion.site/b962ec3c29fb45aab515af5765e7c784
Merge sort (๋ณํฉ์ ๋ ฌ)
merge sort๋ ์ฃผ์ด์ง ๋ฐฐ์ด์ ์์ ํฌ๊ธฐ๋ก ์ชผ๊ฐ์ ์ ๋ ฌํ ๋ค์, ์ด๋ฅผ ์์ฐจ์ ์ผ๋ก ํฉ์น๋ ์ ๋ ฌ ๋ฐฉ์์ด๋ค. ๋ถํ ํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ง๋ง, ์ฃผ๋ก ์ ๋ฐ์ฉ ์ชผ๊ฐ์ ํฉ์น๋ ๋ถํ ์ ๋ณต ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ค.
๋ณํฉ์ ๋ ฌ์ ๋ถํ ์ ํ ๋๋ง๋ค ๋ฌธ์ ํฌ๊ธฐ๊ฐ ์ ๋ฐ์ผ๋ก ์ค์ด๋ ๋ค. ๋์ , ๋ฌธ์ ์ ๊ฐ์๋ 2๋ฐฐ๋ก ๋์ด๋๊ฒ ๋๋ค. (๋ณํฉํด์ผํ๋ ๋ฐฐ์ด์ด 2๋ฐฐ์ฉ ๋์ด๋๋ค๋ ๋ป) ์ด ๋ถ๋ถ ๋ฌธ์ ๋ค์ O(1) ๋ก ์ ๋ ฌํ ์ ์์ ๋ ๊น์ง (์์๊ฐ 1๊ฐ์ผ๋๊น์ง) ์ํ๋๊ณ , ์ด ๋ฌธ์ ๋ค์ O(N)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํฉ์ณ์ง๋ค. ์ด ํฉ์ณ์ง๋ ๊ณผ์ ์ ๋ฌธ์ ์ ๊ฐ์์ ๋ํด์ ๋น๋กํด์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์๊ฐ๋ณต์ก๋๋ O(nlogn)์ด ๋๋ค.
๋ณํฉ์ ๋ ฌ์ ๋ฐ์ดํฐ์ ๋ถํฌ์ ์ํฅ์ ๋ ๋ฐ๋ stableํ ์ ๋ ฌ ๋ฐฉ๋ฒ์ด๋ค. ์ฆ, ์
๋ ฅ ๋ฐ์ดํฐ๊ฐ ๋ฌด์์ด๋ ๊ฐ์, ์ ๋ ฌ๋๋ ์๊ฐ์ O(nlogn)์ผ๋ก ๋์ผํ๋ค.
์๊ฐ๋ณต์ก๋ ์ฆ๋ช
์ ์ด ๊ธ์ ์ฐธ๊ณ ํ์ https://gmlwjd9405.github.io/2018/05/08/algorithm-merge-sort.html
โช๏ธ timsort
์์์ ์ค๋ช
ํ ๋ ๊ฐ์ง์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ํ์ด๋ธ๋ฆฌ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
Run ์ด๋ผ๋ ๋จ์๋ก ๋ฐฐ์ด์ ๋ถํ ํ๊ณ , ์ด ๋ถํ ๋ ๋จ์์ ๋ํด์ ์ฝ์
์ ๋ ฌ์ผ ์ํํ ๋ค, ์ด๋ฅผ ํฉ์ณ์ ์ ๋ ฌ์ ์ํํ๋ค. (๋ณํฉ์ ๋ ฌ)
๋์ ๋ฐฉ์
- minRun ์์ ๊ตฌํ๊ธฐ - ๋ฐฐ์ด์ ๋ถํ ํ ํฌ๊ธฐ ๋จ์๋ฅผ ์ ํ๋ ๊ณผ์
- run ๋ง๋ค๊ธฐ - ์กฐ๊ฑด์ ๋ง์กฑํ๋ ํฌ๊ธฐ๋ก ๋ฐฐ์ด์ ๋ถํ ํ๋ ๊ณผ์
- ๋ถํ ํ ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ minRun๋ณด๋ค ์์ผ๋ฉด, minRun์ด ๋๋๋ก ๋ฐฐ์ด์ ํ์ฅํ๋ค, ์ฝ์ ์ ๋ ฌ๋ก ์ ๋ ฌ
- ํ์ฅ์ด์ ? ์ต๋ํ ์ ์ ํ์๋ก mergeํ๊ธฐ ์ํด์๋ ํฌ๊ธฐ๊ฐ ๋์ผํด์ผํ๊ธฐ ๋๋ฌธ!
- ์ดํ ์ด run๋ค์ stack์ ๋ฃ๋๋ค.
- merge ํ๊ฑฐ๋, ๋ค์ run ๊ตฌํ๊ธฐ - stack์ ์์ธ run๋ค์ ๋จธ์งํ ์ง๋ง์ง ๊ฒฐ์ ํด์ผํ๋ค.
- ์คํ์ ์์์๋ถํฐ 4๊ฐ์ run์ x, y, z, w ๋ผ๊ณ ํ๋ฉด
- ์คํ์ ํฌ๊ธฐ๊ฐ 4 ์ด์์ธ ๊ฒฝ์ฐ |w| > |Z| + |Y|
- ์คํ์ ํฌ๊ธฐ๊ฐ 3์ผ ๊ฒฝ์ฐ |Z| > |X| + |Y|
- ์คํ์ ํฌ๊ธฐ๊ฐ 2์ผ ๊ฒฝ์ฐ |Y| > |X|
- ๋ง์ฝ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ์์ผ๋ฉด, Y๋ฅผ X์ Z์ค ์์์ชฝ๊ณผ ํฉ์นจ
- ์ ์กฐ๊ฑด์ ๋ง์กฑํ๊ฑฐ๋, stack์ ๊ธธ์ด๊ฐ 1์ด ๋๋ฉด merge๋ฅผ ์ข ๋ฃํ๊ณ ๋ค์ run์ ๊ตฌํจ
- ์คํ์ ์์์๋ถํฐ 4๊ฐ์ run์ x, y, z, w ๋ผ๊ณ ํ๋ฉด
์๊ฐ๋ณต์ก๋
timsort๋ ๋ฐฐ์ด์ด ๋ฌด์์๊ฐ ์๋๋ผ๋ ์ ์์ ์ ๋ ฌ์ ์ต์ ํํ ์ข์ ์๋ก, ์ต์ O(N), ์ต์
O(nlogn)์ ๋ณด์ฅํ๋ค.
(์ฐธ๊ณ - https://jcsoohwancho.github.io/2019-11-20-Swift์-๊ธฐ๋ณธ-์ ๋ ฌ-์๊ณ ๋ฆฌ์ฆ-Timsort/)
โซ๏ธ swift sort ์ฝ๋๋ ์ฌ๊ธฐ์ ๋ณผ ์ ์์
์ง๊ธ ํด์ํด๋ณด์ง ์์๊ฑฐ๊ณ ์๊ฐ๋๋ฉด ์ดํด๋ณด๊ธฐ..
https://github.com/apple/swift/blob/main/validation-test/stdlib/Sort.swift.gyb
๐ ์์์ ์์ฑํ์ง ์์ ์ถ๊ฐ์ ์ฐธ๊ณ ์๋ฃ
https://brunch.co.kr/@joonwonlee/8
https://justicehui.github.io/medium-algorithm/2019/03/24/IntroSort/