Search

๋ณ‘ํ•ฉ์ •๋ ฌ

public class MergeSort { public static void mergeSort(int[] arr) { if (arr.length <= 1) return; int mid = arr.length / 2; int[] left = new int[mid]; int[] right = new int[arr.length - mid]; // ๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ for (int i = 0; i < mid; i++) { left[i] = arr[i]; } for (int i = mid; i < arr.length; i++) { right[i - mid] = arr[i]; } // ์žฌ๊ท€์ ์œผ๋กœ ๊ฐ ๋ถ€๋ถ„ ์ •๋ ฌ mergeSort(left); mergeSort(right); // ์ •๋ ฌ๋œ ๋‘ ๋ถ€๋ถ„์„ ๋ณ‘ํ•ฉ merge(arr, left, right); } private static void merge(int[] arr, int[] left, int[] right) { int i = 0, j = 0, k = 0; while (i < left.length && j < right.length) { if (left[i] <= right[j]) { arr[k++] = left[i++]; } else { arr[k++] = right[j++]; } } while (i < left.length) { arr[k++] = left[i++]; } while (j < right.length) { arr[k++] = right[j++]; } } public static void main(String[] args) { int[] arr = {64, 34, 25, 12, 22, 11, 90}; System.out.println("์ •๋ ฌ ์ „ ๋ฐฐ์—ด:"); for (int num : arr) System.out.print(num + " "); System.out.println(); mergeSort(arr); System.out.println("์ •๋ ฌ ํ›„ ๋ฐฐ์—ด:"); for (int num : arr) System.out.print(num + " "); System.out.println(); } }
Java
๋ณต์‚ฌ

์‹œ๊ฐ„๋ณต์žก๋„ ๋ถ„์„

๋ณ‘ํ•ฉ ์ •๋ ฌ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n log n)์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถ„์„์„ ํ†ตํ•ด ๋„์ถœ๋ฉ๋‹ˆ๋‹ค:
โ€ข
๋ถ„ํ•  ๊ณผ์ •: ๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ณผ์ •์ด log n๋ฒˆ ๋ฐœ์ƒ
โ€ข
๋ณ‘ํ•ฉ ๊ณผ์ •: ๊ฐ ๋ ˆ๋ฒจ์—์„œ n๊ฐœ์˜ ์›์†Œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๋Š” ๋ฐ O(n)์˜ ์‹œ๊ฐ„์ด ์†Œ์š”
๋”ฐ๋ผ์„œ ์ „์ฒด ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n) ร— O(log n) = O(n log n)์ด ๋ฉ๋‹ˆ๋‹ค.

๋ถ„ํ•  ๊ณผ์ •

๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ณผ์ •์ด log n๋ฒˆ ๋ฐœ์ƒํ•˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
1.
์ฒซ ๋ฒˆ์งธ ๋ถ„ํ• : nํฌ๊ธฐ์˜ ๋ฐฐ์—ด์„ n/2 ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ”
2.
๋‘ ๋ฒˆ์งธ ๋ถ„ํ• : n/2 ํฌ๊ธฐ์˜ ๋ฐฐ์—ด๋“ค์„ n/4 ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ”
3.
์„ธ ๋ฒˆ์งธ ๋ถ„ํ• : n/4 ํฌ๊ธฐ์˜ ๋ฐฐ์—ด๋“ค์„ n/8 ํฌ๊ธฐ๋กœ ๋‚˜๋ˆ”
4.
์ด๋Ÿฐ ์‹์œผ๋กœ ๊ณ„์† ์ง„ํ–‰๋˜์–ด ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 1์ด ๋  ๋•Œ๊นŒ์ง€ ๋ถ„ํ• 
์ด์ฒ˜๋Ÿผ ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์—, n์—์„œ 1๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ถ„ํ•  ํšŸ์ˆ˜๋Š” logโ‚‚n์ด ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํฌ๊ธฐ๊ฐ€ 8์ธ ๋ฐฐ์—ด์€ 8 โ†’ 4 โ†’ 2 โ†’ 1๋กœ 3๋ฒˆ(logโ‚‚8 = 3)์˜ ๋ถ„ํ• ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
logโ‚‚n์ด ๋˜๋Š” ์ด์œ ๋ฅผ ์ˆ˜ํ•™์ ์œผ๋กœ ์ฆ๋ช…ํ•ด๋ณด๋ฉด:
1.
ํฌ๊ธฐ n์ธ ๋ฐฐ์—ด์ด ์žˆ์„ ๋•Œ, ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค 2๋กœ ๋‚˜๋ˆ„์–ด์ง‘๋‹ˆ๋‹ค.
2.
k๋ฒˆ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ์˜ ํฌ๊ธฐ๋ฅผ ํ‘œํ˜„ํ•˜๋ฉด: n/2^k
3.
๋งˆ์ง€๋ง‰์—๋Š” ํฌ๊ธฐ๊ฐ€ 1์ด ๋˜์–ด์•ผ ํ•˜๋ฏ€๋กœ:
n/2^k = 1
4.
์–‘๋ณ€์— 2^k๋ฅผ ๊ณฑํ•˜๋ฉด:
n = 2^k
5.
์–‘๋ณ€์— logโ‚‚๋ฅผ ์ทจํ•˜๋ฉด:
logโ‚‚n = k
๋”ฐ๋ผ์„œ ๋ฐฐ์—ด์ด ํฌ๊ธฐ 1์ด ๋  ๋•Œ๊นŒ์ง€ ํ•„์š”ํ•œ ๋ถ„ํ•  ํšŸ์ˆ˜ k๋Š” logโ‚‚n์ด ๋ฉ๋‹ˆ๋‹ค.
logโ‚‚n์—์„œ log n์œผ๋กœ ํ‘œ๊ธฐ๊ฐ€ ์ •๋ฆฌ๋˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
1.
๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•์—์„œ๋Š” ์ƒ์ˆ˜๋ฅผ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.
2.
๋กœ๊ทธ์˜ ๋ฐ‘์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋กœ๊ทธ ๋ณ€ํ™˜ ๋ฒ•์น™์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค:
log_a(n) = log_b(n) / log_b(a)
์˜ˆ๋ฅผ ๋“ค์–ด, logโ‚‚n = ln(n) / ln(2) โ‰ˆ 1.443 ร— ln(n)
1.
๋”ฐ๋ผ์„œ logโ‚‚n = c ร— log n (c๋Š” ์ƒ์ˆ˜) ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ , ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•์—์„œ๋Š” ์ƒ์ˆ˜ c๋ฅผ ์ƒ๋žตํ•˜์—ฌ O(log n)์œผ๋กœ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค.
์ด๋Ÿฌํ•œ ์ด์œ ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„์„์—์„œ๋Š” ๋กœ๊ทธ์˜ ๋ฐ‘์„ ๋ช…์‹œํ•˜์ง€ ์•Š๊ณ  ๋‹จ์ˆœํžˆ log n์œผ๋กœ ํ‘œ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

๋ณ‘ํ•ฉ ๊ณผ์ •

๋ณ‘ํ•ฉ ๊ณผ์ •์—์„œ O(n)์˜ ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:
1.
๋‘ ๊ฐœ์˜ ์ •๋ ฌ๋œ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ๋ณ‘ํ•ฉํ•  ๋•Œ, ๊ฐ ์›์†Œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ๋น„๊ตํ•˜๊ณ  ์ƒˆ ๋ฐฐ์—ด์— ๋ณต์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
2.
์™ผ์ชฝ ๋ฐฐ์—ด๊ณผ ์˜ค๋ฅธ์ชฝ ๋ฐฐ์—ด์˜ ์›์†Œ๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋น„๊ตํ•˜๋ฉด์„œ, ๋” ์ž‘์€ ๊ฐ’์„ ๊ฒฐ๊ณผ ๋ฐฐ์—ด์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
3.
์ด ๊ณผ์ •์—์„œ ๋ชจ๋“  ์›์†Œ๋ฅผ ํ•œ ๋ฒˆ์”ฉ ํ™•์ธํ•˜๊ณ  ์ด๋™์‹œ์ผœ์•ผ ํ•˜๋ฏ€๋กœ, n๊ฐœ์˜ ์›์†Œ์— ๋Œ€ํ•ด O(n)์˜ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, ํฌ๊ธฐ๊ฐ€ 8์ธ ๋ฐฐ์—ด์„ ๋ณ‘ํ•ฉํ•  ๋•Œ:
โ€ข
4๊ฐœ์”ฉ ๋‚˜๋ˆˆ ๋‘ ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ์›์†Œ๋“ค์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋น„๊ต
โ€ข
๊ฐ ๋น„๊ต ํ›„ ๋” ์ž‘์€ ์›์†Œ๋ฅผ ๊ฒฐ๊ณผ ๋ฐฐ์—ด์— ๋ณต์‚ฌ
โ€ข
์ตœ์•…์˜ ๊ฒฝ์šฐ, 8๊ฐœ์˜ ์›์†Œ ๋ชจ๋‘๋ฅผ ํ•œ ๋ฒˆ์”ฉ ๋น„๊ตํ•˜๊ณ  ์ด๋™์‹œ์ผœ์•ผ ํ•จ
์ด๋Ÿฌํ•œ ์ž‘์—…์ด ์ „์ฒด ๋ฐฐ์—ด์˜ ํฌ๊ธฐ n์— ๋น„๋ก€ํ•˜์—ฌ ์ฆ๊ฐ€ํ•˜๋ฏ€๋กœ, ๋ณ‘ํ•ฉ ๊ณผ์ •์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n)์ด ๋ฉ๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ์ „์ฒด ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n) ร— O(log n) = O(n log n)์ด ๋ฉ๋‹ˆ๋‹ค.

๊ณต๊ฐ„๋ณต์žก๋„

๋ณ‘ํ•ฉ ์ •๋ ฌ์˜ ๊ณต๊ฐ„๋ณต์žก๋„๋Š” O(n)์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋ณ‘ํ•ฉ ๊ณผ์ •์—์„œ ์›๋ณธ ๋ฐฐ์—ด๊ณผ ๊ฐ™์€ ํฌ๊ธฐ์˜ ์ถ”๊ฐ€ ๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
ํŠน์ง•
โ€ข
์•ˆ์ •์„ฑ: ์•ˆ์ • ์ •๋ ฌ
โ€ข
๋ถ„ํ•  ์ •๋ณต(Divide and Conquer) ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ
โ€ข
๋ชจ๋“  ๊ฒฝ์šฐ(์ตœ์„ , ํ‰๊ท , ์ตœ์•…)์— O(n log n)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๋ณด์žฅ
โ€ข
์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Œ
์ž‘๋™ ๋ฐฉ์‹
1.
๋ฐฐ์—ด์„ ์ ˆ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ”
2.
๊ฐ๊ฐ์˜ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ์žฌ๊ท€์ ์œผ๋กœ ์ •๋ ฌ
3.
์ •๋ ฌ๋œ ๋‘ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ํ•˜๋‚˜๋กœ ๋ณ‘ํ•ฉ
์ด ๊ณผ์ •์„ ํ†ตํ•ด ์ „์ฒด ๋ฐฐ์—ด์ด ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.