# [Sort] Merge Sort

# โš™๏ธ ์ •๋ ฌ ๋ฐฉ์‹

  • ์žฌ๊ท€(recursive) ์šฉ๋ฒ•์„ ํ™œ์šฉํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜
    1. ๋ฆฌ์ŠคํŠธ๋ฅผ ์ ˆ๋ฐ˜์œผ๋กœ ์ž๋ฅด๊ณ  ์ž๋ฅธ ๋ฆฌ์ŠคํŠธ๋„ ์žฌ๊ท€์ ์œผ๋กœ ๊ณ„์† ์ ˆ๋ฐ˜์œผ๋กœ ์ž๋ฆ„
    2. ์ž๋ฅผ ์ˆ˜ ์—†์œผ๋ฉด(len(arr)==1) ๋‹ค์‹œ ๋ฆฌ์ŠคํŠธ๋ฅผ ํ•ฉ์น˜๋ฉด์„œ ์ •๋ ฌํ•˜์—ฌ ์˜ฌ๋ผ์˜ด
    3. ๊ฒฐ๊ตญ ์ •๋ ฌ๋œ ํ•˜๋‚˜์˜ ๋ฆฌ์ŠคํŠธ ๋ฆฌํ„ด
      selection sort
      ์ถœ์ฒ˜: https://en.wikipedia.org/wiki/Selection_sort (opens new window)

# ๐Ÿ“ ๊ตฌํ˜„

# ๋žœ๋ค ๋ฐฐ์—ด ์ƒ์„ฑ

import random as rd
arr = rd.sample(range(1,101), 100)
print(arr)
1
2
3

# ๋žœ๋˜ ๋ฐฐ์—ด ํ™•์ธ

[45, 40, 29, 65, 100, 75, 11, 92, 48, 54, 71, 47, 73, 58, 61, 33, 62, 90, 84, 43, 74, 4, 70, 82, 97, 23, 76, 57, 93, 17, 85, 8, 52, 96, 22, 56, 36, 35, 68, 86, 7, 2, 34, 99, 6, 53, 78, 10, 37, 87, 63, 15, 42, 1, 30, 94, 3, 41, 64, 80, 81, 83, 49, 95, 12, 72, 28, 5, 67, 50, 89, 27, 39, 18, 66, 20, 31, 59, 9, 55, 32, 44, 38, 13, 46, 24, 60, 25, 79, 21, 16, 14, 98, 77, 91, 19, 88, 26, 51, 69]
1

# ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ

def merge_sort(arr):
  if len(arr) <=1: return arr
  mid = len(arr)//2;
  left_arr = merge_sort(arr[:mid])
  right_arr = merge_sort(arr[mid:])
  return merge(left_arr, right_arr)

def merge(left_arr, right_arr):
  merged_arr = list()

  # left_arr, right_arr ๋ชจ๋‘ ๊ฐ’์ด ์žˆ์„ ๋•Œ
  while len(left_arr) > 0 and len(right_arr) > 0:
    if left_arr[0] < right_arr[0] :
      merged_arr.append(left_arr.pop(0))
    else :
      merged_arr.append(right_arr.pop(0))

  # ์œ„ while๋ฌธ์ด ์ข…๋ฃŒ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์€ left_arr right_arr
  # ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ [] ์ด ๋œ ๊ฒƒ์„ ์˜๋ฏธ
  # left_arr์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ๋Š” right_arr์— ๋ฐ์ดํ„ฐ ์—†์Œ
  # left_arr์˜ ๋ฐ์ดํ„ฐ merged_arr๋กœ append
  while len(left_arr) > 0 :
    merged_arr.append(left_arr.pop(0))
  # right_arr์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ๋Š” left_arr์— ๋ฐ์ดํ„ฐ ์—†์Œ
  # right_arr์˜ ๋ฐ์ดํ„ฐ merged_arr๋กœ append
  while len(right_arr) > 0:
    merged_arr.append(right_arr.pop(0))
  return merged_arr
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

# ์ •๋ ฌ ๊ฒฐ๊ณผ ํ™•์ธ

sorted_arr = merge_sort(arr)
print(sorted_arr))
1
2
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100]
1

# ๐Ÿงฎ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ถ„์„

Merge Sort Tree

  • ๊ฐ๊ฐ depth ์—๋Š” $ 2^i $์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ์Œ
  • ๊ฐ๊ฐ depth ์•ˆ์— ๊ฐ๊ฐ ๋…ธ๋“œ์˜ ๋ฆฌ์ŠคํŠธ ๊ธธ์ด๋Š” n2i\frac {n} {2^i}
  • ๋”ฐ๋ผ์„œ ๊ฐ ๋‹จ๊ณ„๋Š” ํ•ญ์ƒ 2iโˆ—n2i==O(n)2^i * \frac{n}{2^i} == O(n)
  • depth ๋Š” ์ด lognlogn ์ด๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(nlogn)O(nlogn)