๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ Python

[Python] sort, sorted ( Tim sort, ํŒ€ ์†ŒํŠธ)

by dev.py 2022. 10. 23.

ํŒŒ์ด์ฌ ๋‚ด์žฅ ๋ชจ๋“ˆ์„ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ๋‹ค๋ณด๋‹ˆ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋‚˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ญ˜๋กœ ์ผ์ง€?

๋‚ด์žฅ ๋ชจ๋“ˆ์˜ 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 ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ •๋ ฌ ํ•˜๋ฉด

  1. ์„ ํƒ ์ •๋ ฌ(Selection Sort)
  2. ์‚ฝ์ž… ์ •๋ ฌ(Insertion Sort)
  3. ๋ฒ„๋ธ” ์ •๋ ฌ(Bubble Sort)
  4. ๋ณ‘ํ•ฉ ์ •๋ ฌ(Merge Sort)
  5. ํ€ต ์ •๋ ฌ(Quick Sort)

์ด ๋– ์˜ค๋ฅด๋Š” ๋ฐ , Tim Sort์€ ์‚ฝ์ž… ์ •๋ ฌ๊ณผ ๋ณ‘ํ•ฉ ์ •๋ ฌ์„ ์ ์ ˆํžˆ ์„ž์€ ๊ฐœ๋…์œผ๋กœ

์ถœ์ฒ˜ : https://d2.naver.com/helloworld/0315536 Insertion Sort
์ถœ์ฒ˜ : https://d2.naver.com/helloworld/0315536   Merge Sort

 

์ถœ์ฒ˜ : https://d2.naver.com/helloworld/0315536

์™œ ์‹œ๊ฐ„ ๋ณต์žก๋„(n^2)๊ฐ€ ๋†’์€ Insertion sort ๋ฅผ ์ป์„ ๊นŒ?

์‚ฝ์ž… ์ •๋ ฌ์˜ ๊ฒฝ์šฐ ์ธ์ ‘ํ•œ ๋ฉ”๋ชจ๋ฆฌ์™€ ๋น„๊ตํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„ ์ฐธ์กฐ ์ง€์—ญ์„ฑ์˜ ์›๋ฆฌ๊ฐ€ ์ž˜ ์ ์šฉ๋œ๋‹ค.

 

์ฐธ์กฐ ์ง€์—ญ์„ฑ์„ ์•Œ๋ ค๋ฉด 

 

1) ๊ณต๊ฐ„(spatial) ์ง€์—ญ์„ฑ : ํŠน์„ฑ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๊ธฐ์–ต ์žฅ์†Œ๋“ค์— ๋Œ€ํ•ด ์ฐธ์กฐ๊ฐ€ ์ง‘์ค‘์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒฝํ–ฅ์œผ๋กœ, ์ฐธ์กฐ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ทผ์ฒ˜์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค.

2) ์‹œ๊ฐ„(temporal) ์ง€์—ญ์„ฑ : ์ตœ๊ทผ ์‚ฌ์šฉ๋˜์—ˆ๋˜ ๊ธฐ์–ต ์žฅ์†Œ๋“ค์ด ์ง‘์ค‘์ ์œผ๋กœ ์•ก์„ธ์Šค๋˜๋Š” ๊ฒฝํ–ฅ์œผ๋กœ, ์ฐธ์กฐํ–ˆ๋˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋น ๋ฅธ ์‹œ๊ฐ„์— ๋‹ค์‹œ ์ฐธ์กฐ๋  ํ™•๋ฅ ์ด ๋†’์Šต๋‹ˆ๋‹ค.

3) ์ˆœ์ฐจ(sequential) ์ง€์—ญ์„ฑ : ๋ฐ์ดํ„ฐ๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ์•ก์„ธ์Šค๋˜๋Š” ๊ฒฝํ–ฅ์œผ๋กœ, ํ”„๋กœ๊ทธ๋žจ ๋‚ด์˜ ๋ช…๋ น์–ด๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด ๋Œ€ํ‘œ์ ์ธ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๊ณต๊ฐ„ ์ง€์—ญ์„ฑ์— ํŽธ์ž…๋˜์–ด ์„ค๋ช…๋˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜: https://jwprogramming.tistory.com/18 [๊ฐœ๋ฐœ์ž๋ฅผ ๊ฟˆ๊พธ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ:ํ‹ฐ์Šคํ† ๋ฆฌ]

 

์ฐธ์กฐ ์ง€์—ญ์„ฑ์„ ์ƒ๊ฐํ•˜๋ ค๋ฉด CPU์•ˆ์— ์บ์‹œ๋Š” ๋น ๋ฅด๊ณ , ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜ค๋Š” (ํŽ˜์ด์ง€, ๋กœ๋“œ, ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ ์•„๋ฌดํŠผ ๋Š๋ฆผ)๋ผ๋Š” ๊ธฐ๋ณธ์ „์ œ์—์„œ

๋งˆ์นจ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹œ์— ์žˆ๋Š” (์บ์‹œ ํžˆํŠธ) ์ข‹์€ ๊ฒฝ์šฐ,  ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” (์บ์‹œ ๋ฏธ์Šค) ์•ˆ ์ข‹์€ ๊ฒฝ์šฐ๋กœ ๋‚˜๋ˆ  ์ดํ•ดํ•˜์ž

 

๊ณต๊ฐ„ ์ง€์—ญ์„ฑ์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์ƒ ๋น„์Šทํ•˜๋‹ˆ ๋ญ‰์น  ์งธ๋กœ ๋“ค๊ณ  ์˜ฌ๋•Œ ๊ฐ™์ด ๋“ค๊ณ  ์˜ค๋ฉด ์ข‹์„ ๊ฒƒ์ด๋‹ค.

์‹œ๊ฐ„ ์ง€์—ญ์„ฑ์€ ์ตœ๊ทผ์— ์‚ฌ์šฉํ–ˆ์œผ๋‹ˆ ๋˜ ์“ธ ๊ฒƒ์ด๋‹ค.

์ˆœ์ฐจ ์ง€์—ญ์„ฑ์€ ๋ณดํ†ต ๋ฐ์ดํ„ฐ๋“ค์ด for๋ฌธ์ด๋‚˜ while๋ฌธ์„ ํ†ตํ•ด ํ•˜๋‚˜์”ฉ ์กฐํšŒํ•œ๋‹ค. ๋‹ค์‹œ ์กฐํšŒํ•  ํ™•๋ฅ ์ด ๋†’๋‹ค.

๋ผ๋Š” ์ƒ๊ฐ์— ์บ์‹œ ๊ฐ€์ ธ์˜ค๋ฉด ์ž˜ ์“ฐ๊ฒ ์ง€ํ•˜๋ฉด์„œ ์บ์‹œ์— ๋ฐ€์–ด ๋„ฃ๋Š”๋‹ค. -> ์บ์‹œํžˆํŠธ๊ฐ€ ๋‚˜์„œ -> ์ฒ˜๋ฆฌ๊ฐ€ ๋น ๋ฅด๋‹ค

 

๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ ์‚ฝ์ž… ์ •๋ ฌ์ด ์ž‘์€ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ํ€ต ์†ŒํŠธ๋ณด๋‹ค ๋น ๋ฅด๋‹ค. 

์ด ์ƒํ™ฉ์—์„œ ์ „์ฒด ์ผ€์ด์Šค๋ฅผ ์ž‘์€ ๋ฉ์–ด๋ฆฌ๋กœ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ํ˜•์‹์ด ๊ธฐ๋ณธ ์ปจ์…‰์ด๋‹ค.

 

Tim Sort

๋“œ๋””์–ด Tim sort ๋‚ด๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณด์ž

 

์ „์ฒด๋ฅผ ์ ๋‹นํ•œ ๋ฉ์–ด๋ฆฌ๋กœ ์ž˜๋ผ์„œ ์‚ฝ์ž… ์ •๋ ฌ ํ›„, ๋จธ์ง€ ์ •๋ ฌ์„ ํ•œ๋‹คํ•˜๋‹ˆ, ์ด์ œ ์ ๋‹นํ•œ ๋ฉ์–ด๋ฆฌ๋ฅผ ์ •ํ•ด์•ผํ•œ๋‹ค.

 

์ถœ์ฒ˜ : https://d2.naver.com/helloworld/0315536

 

์ดํ›„ ๋‚ด์šฉ์€ ๊ฐ„๋žตํ•˜๊ฒŒ๋งŒ ์„œ์ˆ 

 

Run 

1. ๊ธฐ๋ณธ์ ์œผ๋กœ 2^X ๊ฐœ๋กœ ๋ฉ์–ด๋ฆฌ ๋‚˜๋ˆ„์–ด ์ž๋ฅธ๋‹ค.

2. ๋ฉ์–ด๋ฆฌ๊ฐ€ ์ตœ๋Œ€๋กœ ํ‚ค์šฐ๊ธฐ ์œ„ํ•ด ๋ฉ์–ด๋ฆฌ ๋‚˜๋ˆˆ ํ›„, ์ดํ›„์˜ ๊ฐ’์ด ๋ฉ์–ด๋ฆฌ ๊ฐ’๋ณด๋‹ค ํฐ๋‹ค๋ฉด ๋ฉ์–ด๋ฆฌ์— ๋„ฃ๋Š”๋‹ค. (์ž‘์„ ๋•Œ๊นŒ์ง€)

3. ํ•œ ๋ฉ์–ด๋ฆฌ (run) ์„ ๋งŒ๋“ค์—ˆ๋‹ค๋ฉด, ์ดํ›„ ๋ฉ์–ด๋ฆฌ๋Š” ์ž‘์•„์ง€๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋งŒ๋“ ๋‹ค.

 

2. ๊ณผ์ •์—์„œ ์‹ค์ƒํ™œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋“ค์ด ๊ทœ์น™์  ๋˜๋Š” ์ˆœ์ฐจ์ ์ธ ํŠน์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ–ˆ์„ ๋•Œ, Tim sort์˜ ์žฅ์ ์ด ๋‚˜์˜จ๋‹ค.

Binary Insertion sort

๋ฉ์–ด๋ฆฌ๋Š” ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ๊ธฐ์— ์ด์ง„ ์ •๋ ฌ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

Merge

์•ž์„œ ๋ฉ์–ด๋ฆฌ์˜ ํฌ๊ธฐ๋ฅผ ์œ ๋™์ ์œผ๋กœ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ง€๋‚˜์นœ ํฌ๊ธฐ ์ฐจ์ด๋Š” ๋น„ํšจ์œจ์ ์ธ ๊ฒฐ๊ณผ ๊ฐ€์ ธ์˜จ๋‹ค. (์‚ฌ์‹ค์ƒ ๋จธ์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ์ •๋ ฌ์ด๋ผ)

๋จธ์ง€๋ฅผ ํ•  ๋•Œ๋Š” ๋น„์Šทํ•œ ํฌ๊ธฐ ๋ผ๋ฆฌ ๋จผ์ € ๋จธ์ง€๋ฅผ ํ•œ ํ›„, ๋จธ์ง€๋ฅผ ์นœ๋‹ค.

 

2 Run Merge

์œ„์— ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด, ๋จธ์ง€์˜ ํšจ์œจ์„ฑ์„ ์˜ฌ๋ ธ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๋จธ์ง€ ์ •๋ ฌ์˜ ๋‹จ์ ์ธ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ, ์ž‘์€ run์„ Copy ํ•œ ๋‹ค์Œ, ๋‘ run ์‹œ์ž‘ ์œ„์น˜๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ์ ‘๊ทผ ํ›„, ๋ฎ์–ด์“ด๋‹ค. ์ด ๋•Œ,  ํฐ Run ๊ฐ’์€ ์ •๋ ฌ ์ „์— ๋ฎ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

 

์—ฌ๊ธฐ์„œ ํ•œ๋ฒˆ ๋” ์ตœ์ ํ™”๋ฅผ ํ–ˆ๋Š”๋ฐ, ๊ณ„์‚ฐ์ด ํ•„์š”์—†๋Š” ๋ถ€๋ถ„์„ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•œ๋‹ค. 

Galloping

์ด๊ฑด ๋‚˜์ค‘์—..