๐Ÿงฉ Algorithm/๊ฐœ๋… ๋ฐ ์ž๋ฃŒ๊ตฌ์กฐ

[Algorithm] ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹ฌํ™” ๋ถ„์„: O(n²)๋ถ€ํ„ฐ Timsort๊นŒ์ง€

devCloud 2026. 4. 29. 17:14
728x90
ALGORITHM NOTE

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹ฌํ™” ๋ถ„์„: O(n²)๋ถ€ํ„ฐ Timsort๊นŒ์ง€

01. ๋ฒ„๋ธ” / ์„ ํƒ / ์‚ฝ์ž… - O(n²)์˜ ์„ฑ๋Šฅ ์ฐจ์ด

์…‹ ๋‹ค ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(n^2)์ด์ง€๋งŒ, ์‹ค์ œ ๋™์ž‘ ๋ฐฉ์‹์— ๋”ฐ๋ผ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ์„ ํƒ ์ •๋ ฌ (Selection Sort): ๋งค ๋ผ์šด๋“œ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ์•„ ๋งจ ์•ž๊ณผ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋น„๊ต ํšŸ์ˆ˜๋Š” ํ•ญ์ƒ n(n-1)/2๋กœ ๊ณ ์ •์ด๋ฉฐ, ์ด๋ฏธ ์ •๋ ฌ๋œ ์ƒํƒœ๋ผ๋„ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜์ง€ ์•Š์•„ ์‹ค์šฉ์„ฑ์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค.
  • ๋ฒ„๋ธ” ์ •๋ ฌ (Bubble Sort): ์ธ์ ‘ํ•œ ๋‘ ์›์†Œ๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ตํ™˜(swap) ์ž‘์—…์ด ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚˜๊ณ  ์บ์‹œ ํšจ์œจ์ด ๋‚˜๋น  ์‹ค์ œ ์„ฑ๋Šฅ์ด ๊ฐ€์žฅ ๋–จ์–ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
  • ์‚ฝ์ž… ์ •๋ ฌ (Insertion Sort): ์ •๋ ฌ๋œ ๋ถ€๋ถ„์˜ ์ ์ ˆํ•œ ์œ„์น˜์— ์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฑฐ์˜ ์ •๋ ฌ๋œ ์ƒํƒœ๋ผ๋ฉด O(n)์— ์ˆ˜๋ ดํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ํŠน์ง•์ด ์žˆ์–ด Timsort์˜ ํ•ต์‹ฌ ์„œ๋ธŒ๋ฃจํ‹ด์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

02. ํ€ต ์ •๋ ฌ - ํ‰๊ท  O(n log n), ์ตœ์•… O(n^2)

๋ถ„ํ•  ์ •๋ณต์˜ ์›๋ฆฌ

ํ”ผ๋ฒ—(Pivot)์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์—ด์„ ๋ฐ˜์”ฉ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ ์ ˆ๋ฐ˜์”ฉ ๋‚˜๋‰œ๋‹ค๋ฉด ์žฌ๊ท€ ๊นŠ์ด๋Š” log n์ด ๋˜๊ณ , ๊ฐ ๋‹จ๊ณ„์—์„œ n๋ฒˆ ๋น„๊ตํ•˜๋ฏ€๋กœ O(n log n)์ด ๋ฉ๋‹ˆ๋‹ค.

์ตœ์•…์˜ ์ƒํ™ฉ (O(n^2))

์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์—์„œ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ์„ ํƒํ•˜๋ฉด, ๋ถ„ํ• ์ด [1๊ฐœ] + [n-1๊ฐœ]๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žฌ๊ท€ ๊นŠ์ด๊ฐ€ n๊นŒ์ง€ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.

[1, 2, 3, 4, 5] → pivot:1 → [] + [2,3,4,5]
[2, 3, 4, 5]    → pivot:2 → [] + [3,4,5] (์žฌ๊ท€ n๋ฒˆ ๋ฐœ์ƒ)

์‹ค๋ฌด์—์„œ์˜ ๋Œ€์‘

ํ”ผ๋ฒ—์„ ๋žœ๋คํ•˜๊ฒŒ ์ •ํ•˜๊ฑฐ๋‚˜ ์ฒซ/์ค‘๊ฐ„/๋ ๊ฐ’ ์ค‘ ์ค‘๊ฐ„๊ฐ’์„ ํ”ผ๋ฒ—์œผ๋กœ ์“ฐ๋Š” Median-of-Three ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Java์˜ Dual-Pivot Quicksort๋Š” ํ”ผ๋ฒ— 2๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋†’์ด๊ณ , ์žฌ๊ท€๊ฐ€ ๋„ˆ๋ฌด ๊นŠ์–ด์ง€๋ฉด ํž™ ์ •๋ ฌ๋กœ ์ „ํ™˜ํ•˜๋Š” ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๋ฐฉ์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค.

 

03. ๋ณ‘ํ•ฉ ์ •๋ ฌ์ด '์•ˆ์ • ์ •๋ ฌ'์ธ ์ด์œ 

๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ์›์†Œ๊ฐ€ ํ•˜๋‚˜๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ์ชผ๊ฐ  ํ›„, ๋‹ค์‹œ ํ•ฉ์น˜๋ฉด์„œ ์ •๋ ฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๐Ÿ’ก ํ•ต์‹ฌ: ์•ˆ์ •์„ฑ(Stability)์˜ ๊ฒฐ์ •ํƒ€

๋ณ‘ํ•ฉ(Merge) ์‹œ ๋™์ผํ•œ ๊ฐ’์„ ๋งŒ๋‚˜๋ฉด ๋ฐ˜๋“œ์‹œ ์™ผ์ชฝ ๋ฐฐ์—ด์˜ ์›์†Œ๋ฅผ ๋จผ์ € ๊ฒฐ๊ณผ์— ๋‹ด์Šต๋‹ˆ๋‹ค.

if (arr[i] <= arr[j]) {
    temp[k++] = arr[i++]; // ๋“ฑํ˜ธ(=)๊ฐ€ ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•จ
}

๋งŒ์•ฝ <= ๋Œ€์‹  <๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผ ๊ฐ’์ผ ๋•Œ ์˜ค๋ฅธ์ชฝ ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐ€ ๋จผ์ € ๋“ค์–ด๊ฐ€ ์ˆœ์„œ๊ฐ€ ๋’ค์ง‘ํžˆ๊ฒŒ(Unstable) ๋ฉ๋‹ˆ๋‹ค.

 

04. Java Arrays.sort()์™€ Timsort

์ •๋ ฌ ๋Œ€์ƒ ์‚ฌ์šฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜
Primitive Type (int[], double[]...) Dual-Pivot Quicksort (์†๋„ ์šฐ์„ )
Object Type (String[], Custom Class...) Timsort (์•ˆ์ •์„ฑ ๋ณด์žฅ)

์™œ ๊ฐ์ฒด ์ •๋ ฌ์—๋Š” Timsort์ธ๊ฐ€?

๊ฐ์ฒด ์ •๋ ฌ์€ ์•ˆ์ • ์ •๋ ฌ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค. Timsort๋Š” ๋ณ‘ํ•ฉ ์ •๋ ฌ + ์‚ฝ์ž… ์ •๋ ฌ์˜ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ์‹ค์„ธ๊ณ„ ๋ฐ์ดํ„ฐ์˜ '๋ถ€๋ถ„ ์ •๋ ฌ ์ƒํƒœ'๋ฅผ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜์—ฌ ์ตœ์„ ์˜ ๊ฒฝ์šฐ O(n), ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ O(n log n)์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

 

05. ์‹ฌํ™” ๊ฐœ๋… ๋ฐ ์šฉ์–ด ์ •๋ฆฌ

๋ฒ„๋ธ” ์ •๋ ฌ์˜ ์ตœ์ ํ™”: Swap Flag

for (int i = 0; i < n - 1; i++) {
    boolean swapped = false; // swap flag
    for (int j = 0; j < n - i - 1; j++) {
        if (arr[j] > arr[j + 1]) {
            swap(arr, j, j + 1);
            swapped = true;
        }
    }
    if (!swapped) break; // ๊ตํ™˜ ์—†์œผ๋ฉด ์กฐ๊ธฐ ์ข…๋ฃŒ (์ตœ์„  O(n))
}

Timsort๋ž€?

Python ๊ฐœ๋ฐœ์ž Tim Peters๊ฐ€ ๊ณ ์•ˆํ•œ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ •๋ ฌ. ์ด๋ก ์  ์ตœ์ ์„ ๋„˜์–ด ์‹ค์ œ ๋ฐ์ดํ„ฐ ํ™˜๊ฒฝ์—์„œ ์ตœ์ƒ์˜ ํผํฌ๋จผ์Šค๋ฅผ ๋‚ด๋„๋ก ์„ค๊ณ„๋จ.

์„œ๋ธŒ๋ฃจํ‹ด(Subroutine)์ด๋ž€?

ํŠน์ • ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ๋˜๋Š” ๋ถ€ํ’ˆ ํ•จ์ˆ˜. Timsort๊ฐ€ ๊ฐ ๊ตฌ๊ฐ„์„ ์ •๋ ฌํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” '์‚ฝ์ž… ์ •๋ ฌ'์ด ๋ฐ”๋กœ ์„œ๋ธŒ๋ฃจํ‹ด์˜ ์˜ˆ์‹œ.

Last Sync: 2026-04-29 | Algorithm Study Archive
728x90