ํ์ด์ฌ ๋ด์ฅ ๋ชจ๋์ ์ ์ฉํ๊ฒ ์ฐ๋ค๋ณด๋ ๋ด๋ถ ๊ตฌ์กฐ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋ญ๋ก ์ผ์ง?
๋ด์ฅ ๋ชจ๋์ sort() ์๊ณ ๋ฆฌ์ฆ์ด ๊ถ๊ธํด์ก๋ค.
Sort() vs Sorted()
sort ํจ์๋ List.sort(*, key=None, reverse=False) ํ์์ผ๋ก "๋ฆฌ์คํธํ์ ๋ฉ์๋"โโ์ผ๋ก ๋ฆฌ์คํธ_๊ฐ์ฒด ๊ฐ์ ์ง์ ์์ ํ๋ค.
sorted ํจ์๋ sorted(iterable, /, *, key=None, reverse=False) ํ์์ผ๋ก "ํ์ด์ฌ ๊ธฐ๋ณธ ๋ด์ฅ ํจ์"์ผ๋ก ์๋ณธ ๊ฐ์ ๊ทธ๋๋ก์ด๊ณ ์ ๋ ฌ ๊ฐ์ ๋ฐํํ๋ค.
๊ฒฐ๋ก ๋ถํฐ ๋งํ๋ฉด
- ํ์ด์ฌ Sort ์๊ณ ๋ฆฌ์ฆ์ Tim Sort๋ก ์ฝ์ ์ ๋ ฌ๊ณผ ๋จธ์ง ์ ๋ ฌ์ ํผํฉํ์ฌ ์ฌ์ฉํ์๋ ๋ฐ, ์ฝ์ ์ ๋ ฌ์ ์ฌ์ฉํ ์ด์ ๋ ์บ์ํํธ & ์บ์๋ฏธ์ค & ์ง์ญ ์ฐธ์กฐ์ฑ์ ์ ๋ง์กฑ์ํค๊ธฐ ๋๋ฌธ์ด๋ค. Tim Sort ๋ ์ฝ์ ์ ๋ ฌ๊ณผ ๋จธ์ง ์ ๋ ฌ์ ์ ์ ํ ๊ฒฝ๊ณ์ ์ ์ฐพ๋ ๊ฒ์ด ํต์ฌ์ด๋ค.
- ๋ฌด์์ ๋ฐ์ดํฐ์์๋ ์ต์ O(n log n )์ด ๋ฐ์ํ ์ ์์ง๋ง, ์ค์ ๋ฐ์ดํฐ๋ ์์ ๋ฌด์์ ๋ฐ์ดํฐ ๋ณด๋ค๋ ๊ท์น์ฑ์ด ์๋ค๊ณ ๊ฐ์ ํ์ ๋, ๋งค์ฐ ํจ๊ณผ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ด์ด์, ๋ง์ ์ธ์ด์์ ์ฑํํ๊ณ ์๋ค.
๊ทธ๋ฌ๋ฉด ์ด์ ๊ถ๊ธํ ๊ฑด
1. ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์๋ ๊ฐ ?
๊ธฐ๋ณธ์ ์ผ๋ก ๋๋ค Tim Sort ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ค. ์ ๋ ฌ ํ๋ฉด
- ์ ํ ์ ๋ ฌ(Selection Sort)
- ์ฝ์ ์ ๋ ฌ(Insertion Sort)
- ๋ฒ๋ธ ์ ๋ ฌ(Bubble Sort)
- ๋ณํฉ ์ ๋ ฌ(Merge Sort)
- ํต ์ ๋ ฌ(Quick Sort)
์ด ๋ ์ค๋ฅด๋ ๋ฐ , Tim Sort์ ์ฝ์ ์ ๋ ฌ๊ณผ ๋ณํฉ ์ ๋ ฌ์ ์ ์ ํ ์์ ๊ฐ๋ ์ผ๋ก



์ ์๊ฐ ๋ณต์ก๋(n^2)๊ฐ ๋์ Insertion sort ๋ฅผ ์ป์ ๊น?
์ฝ์ ์ ๋ ฌ์ ๊ฒฝ์ฐ ์ธ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋น๊ตํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ์ฐธ์กฐ ์ง์ญ์ฑ์ ์๋ฆฌ๊ฐ ์ ์ ์ฉ๋๋ค.
์ฐธ์กฐ ์ง์ญ์ฑ์ ์๋ ค๋ฉด
1) ๊ณต๊ฐ(spatial) ์ง์ญ์ฑ : ํน์ฑ ํด๋ฌ์คํฐ์ ๊ธฐ์ต ์ฅ์๋ค์ ๋ํด ์ฐธ์กฐ๊ฐ ์ง์ค์ ์ผ๋ก ์ด๋ฃจ์ด์ง๋ ๊ฒฝํฅ์ผ๋ก, ์ฐธ์กฐ๋ ๋ฉ๋ชจ๋ฆฌ ๊ทผ์ฒ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํฉ๋๋ค.
2) ์๊ฐ(temporal) ์ง์ญ์ฑ : ์ต๊ทผ ์ฌ์ฉ๋์๋ ๊ธฐ์ต ์ฅ์๋ค์ด ์ง์ค์ ์ผ๋ก ์ก์ธ์ค๋๋ ๊ฒฝํฅ์ผ๋ก, ์ฐธ์กฐํ๋ ๋ฉ๋ชจ๋ฆฌ๋ ๋น ๋ฅธ ์๊ฐ์ ๋ค์ ์ฐธ์กฐ๋ ํ๋ฅ ์ด ๋์ต๋๋ค.
3) ์์ฐจ(sequential) ์ง์ญ์ฑ : ๋ฐ์ดํฐ๊ฐ ์์ฐจ์ ์ผ๋ก ์ก์ธ์ค๋๋ ๊ฒฝํฅ์ผ๋ก, ํ๋ก๊ทธ๋จ ๋ด์ ๋ช ๋ น์ด๊ฐ ์์ฐจ์ ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ค๋ ๊ฒ์ด ๋ํ์ ์ธ ๊ฒฝ์ฐ์ ๋๋ค. ๊ณต๊ฐ ์ง์ญ์ฑ์ ํธ์ ๋์ด ์ค๋ช ๋๊ธฐ๋ ํฉ๋๋ค.
์ถ์ฒ: https://jwprogramming.tistory.com/18 [๊ฐ๋ฐ์๋ฅผ ๊ฟ๊พธ๋ ํ๋ก๊ทธ๋๋จธ:ํฐ์คํ ๋ฆฌ]
์ฐธ์กฐ ์ง์ญ์ฑ์ ์๊ฐํ๋ ค๋ฉด CPU์์ ์บ์๋ ๋น ๋ฅด๊ณ , ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ ธ์ค๋ (ํ์ด์ง, ๋ก๋, ๊ฐ์๋ฉ๋ชจ๋ฆฌ ์๋ฌดํผ ๋๋ฆผ)๋ผ๋ ๊ธฐ๋ณธ์ ์ ์์
๋ง์นจ ํ์ํ ๋ฐ์ดํฐ๊ฐ ์บ์์ ์๋ (์บ์ ํํธ) ์ข์ ๊ฒฝ์ฐ, ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๊ฐ ์๋ (์บ์ ๋ฏธ์ค) ์ ์ข์ ๊ฒฝ์ฐ๋ก ๋๋ ์ดํดํ์
๊ณต๊ฐ ์ง์ญ์ฑ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋น์ทํ๋ ๋ญ์น ์งธ๋ก ๋ค๊ณ ์ฌ๋ ๊ฐ์ด ๋ค๊ณ ์ค๋ฉด ์ข์ ๊ฒ์ด๋ค.
์๊ฐ ์ง์ญ์ฑ์ ์ต๊ทผ์ ์ฌ์ฉํ์ผ๋ ๋ ์ธ ๊ฒ์ด๋ค.
์์ฐจ ์ง์ญ์ฑ์ ๋ณดํต ๋ฐ์ดํฐ๋ค์ด for๋ฌธ์ด๋ while๋ฌธ์ ํตํด ํ๋์ฉ ์กฐํํ๋ค. ๋ค์ ์กฐํํ ํ๋ฅ ์ด ๋๋ค.
๋ผ๋ ์๊ฐ์ ์บ์ ๊ฐ์ ธ์ค๋ฉด ์ ์ฐ๊ฒ ์งํ๋ฉด์ ์บ์์ ๋ฐ์ด ๋ฃ๋๋ค. -> ์บ์ํํธ๊ฐ ๋์ -> ์ฒ๋ฆฌ๊ฐ ๋น ๋ฅด๋ค
๊ทธ๋ฌ๋ค ๋ณด๋ ์ฝ์ ์ ๋ ฌ์ด ์์ ์ผ์ด์ค์ ๋ํด ํต ์ํธ๋ณด๋ค ๋น ๋ฅด๋ค.
์ด ์ํฉ์์ ์ ์ฒด ์ผ์ด์ค๋ฅผ ์์ ๋ฉ์ด๋ฆฌ๋ก ๋ง๋ค๊ณ ์ด๋ฅผ ๋ณํฉํ๋ ํ์์ด ๊ธฐ๋ณธ ์ปจ์ ์ด๋ค.
Tim Sort
๋๋์ด Tim sort ๋ด๋ถ ์๊ณ ๋ฆฌ์ฆ์ ๋ณด์
์ ์ฒด๋ฅผ ์ ๋นํ ๋ฉ์ด๋ฆฌ๋ก ์๋ผ์ ์ฝ์ ์ ๋ ฌ ํ, ๋จธ์ง ์ ๋ ฌ์ ํ๋คํ๋, ์ด์ ์ ๋นํ ๋ฉ์ด๋ฆฌ๋ฅผ ์ ํด์ผํ๋ค.

์ดํ ๋ด์ฉ์ ๊ฐ๋ตํ๊ฒ๋ง ์์
Run
1. ๊ธฐ๋ณธ์ ์ผ๋ก 2^X ๊ฐ๋ก ๋ฉ์ด๋ฆฌ ๋๋์ด ์๋ฅธ๋ค.
2. ๋ฉ์ด๋ฆฌ๊ฐ ์ต๋๋ก ํค์ฐ๊ธฐ ์ํด ๋ฉ์ด๋ฆฌ ๋๋ ํ, ์ดํ์ ๊ฐ์ด ๋ฉ์ด๋ฆฌ ๊ฐ๋ณด๋ค ํฐ๋ค๋ฉด ๋ฉ์ด๋ฆฌ์ ๋ฃ๋๋ค. (์์ ๋๊น์ง)
3. ํ ๋ฉ์ด๋ฆฌ (run) ์ ๋ง๋ค์๋ค๋ฉด, ์ดํ ๋ฉ์ด๋ฆฌ๋ ์์์ง๋ ๋ฐฉํฅ์ผ๋ก ๋ง๋ ๋ค.
2. ๊ณผ์ ์์ ์ค์ํ์์ ์ฌ์ฉํ๋ ๋ฐ์ดํฐ๋ค์ด ๊ท์น์ ๋๋ ์์ฐจ์ ์ธ ํน์ฑ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ๊ฐ์ ํ์ ๋, Tim sort์ ์ฅ์ ์ด ๋์จ๋ค.
Binary Insertion sort
๋ฉ์ด๋ฆฌ๋ ์ด๋ฏธ ์ ๋ ฌ๋์ด ์๊ธฐ์ ์ด์ง ์ ๋ ฌ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
Merge
์์ ๋ฉ์ด๋ฆฌ์ ํฌ๊ธฐ๋ฅผ ์ ๋์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, ์ง๋์น ํฌ๊ธฐ ์ฐจ์ด๋ ๋นํจ์จ์ ์ธ ๊ฒฐ๊ณผ ๊ฐ์ ธ์จ๋ค. (์ฌ์ค์ ๋จธ์ง๊ฐ ์๋๋ผ ์ ๋ ฌ์ด๋ผ)
๋จธ์ง๋ฅผ ํ ๋๋ ๋น์ทํ ํฌ๊ธฐ ๋ผ๋ฆฌ ๋จผ์ ๋จธ์ง๋ฅผ ํ ํ, ๋จธ์ง๋ฅผ ์น๋ค.
2 Run Merge
์์ ๋ฐฉ๋ฒ์ ํตํด, ๋จธ์ง์ ํจ์จ์ฑ์ ์ฌ๋ ธ๋ค. ํ์ง๋ง ์ฌ์ ํ ๋จธ์ง ์ ๋ ฌ์ ๋จ์ ์ธ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ์ ๊ฐ ์๋๋ฐ, ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์, ์์ run์ Copy ํ ๋ค์, ๋ run ์์ ์์น๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ ๊ทผ ํ, ๋ฎ์ด์ด๋ค. ์ด ๋, ํฐ Run ๊ฐ์ ์ ๋ ฌ ์ ์ ๋ฎ์ด์ง์ง ์๋๋ค.
์ฌ๊ธฐ์ ํ๋ฒ ๋ ์ต์ ํ๋ฅผ ํ๋๋ฐ, ๊ณ์ฐ์ด ํ์์๋ ๋ถ๋ถ์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๋ค.
Galloping
์ด๊ฑด ๋์ค์..
'๐ Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] Pandas, Numpy ์ฑ๋ฅ ํฅ์ (feat.Pandas vs Numpy) (0) | 2024.05.06 |
---|---|
Python 3.11 ๋ฌ๋ผ์ง ์ - ์ ๋ฐ์ดํธ (0) | 2024.01.15 |
์๋ฃ๊ตฌ์กฐ - List, Dict, Set, Tuple (0) | 2022.10.27 |
ํ์ด์ฌ Python GUI - ๊ทธ๋ํ (pyqtgraph, matplotlib) (realtime, ์ค์๊ฐ) (0) | 2021.02.20 |
ํ์ด์ฌ Python GUI (Tkinter vs PyQt ) ํ๋ ์์ํฌ (0) | 2021.02.20 |