Algorithm/์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ณต๋ถ€

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ์ •๋ ฌ - ์„ ํƒ ์ •๋ ฌ, ์‚ฝ์ž… ์ •๋ ฌ, ํ€ต ์ •๋ ฌ, ๊ณ„์ˆ˜ ์ •๋ ฌ

meeeeejin 2021. 7. 10. 13:17

 

์ •๋ ฌ(Sorting)์ด๋ž€ ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ •ํ•œ ๊ธฐ์ค€์— ๋”ฐ๋ผ์„œ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

 

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ ฌํ•˜๋ฉด ์ด์ง„ ํƒ์ƒ‰(Binary Search)์ด ๊ฐ€๋Šฅํ•ด์ง„๋‹ค. ๋˜ํ•œ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•  ๋•Œ ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ •๋ ฌํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ ์‹œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. 

 

 

์„ ํƒ ์ •๋ ฌ(Selection Sort)

๐Ÿ’ก ์•„์ด๋””์–ด

๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์ž‘์œ„๋กœ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ๋•Œ, ๊ทธ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ด ๋งจ ์•ž์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์™€ ๋ฐ”๊พธ๊ณ , ๊ทธ๋‹ค์Œ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•ด ์•ž์—์„œ ๋‘ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ์™€ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ด๋ณด์ž

=> ๋งค๋ฒˆ ๊ฐ€์žฅ ์ž‘์€ ๊ฒƒ์„ ์„ ํƒํ•œ๋‹ค

์ถœ์ฒ˜: ์œ„ํ‚ค๋ฐฑ๊ณผ -  ์„ ํƒ ์ •๋ ฌ

 

๐Ÿ’ก ์†Œ์Šค์ฝ”๋“œ

def sel_sort(array):
  for i in range(len(array)):
    min_index = i # ๊ฐ€์žฅ ์ž‘์€ ์›์†Œ์˜ ์ธ๋ฑ์Šค
    for j in range(i + 1, len(array)):
      if array[j] < array[min_index]:
        min_index = j
    array[i], array[min_index] = array[min_index], array[i] # swap

  return array

# ์‹œ๊ฐ„๋ณต์žก๋„: O(N^2)

 

 

 

 

์‚ฝ์ž… ์ •๋ ฌ(Insertion Sort)

๐Ÿ’ก ์•„์ด๋””์–ด

๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๋ฉฐ, ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ ์ ˆํ•œ ์œ„์น˜์— ์‚ฝ์ž…ํ•ด๋ณด์ž

์ถœ์ฒ˜: ์œ„ํ‚ค๋ฐฑ๊ณผ - ์‚ฝ์ž… ์ •๋ ฌ

 

๐Ÿ’ก ์†Œ์Šค์ฝ”๋“œ

def ins_sort(array):
  for i in range(1, len(array)):
    for j in range(i, 0, -1):
      if array[j] < array[j - 1]: # ํ•œ ์นธ์”ฉ ์™ผ์ชฝ์œผ๋กœ ์ด๋™
        array[j], array[j - 1] = array[j - 1], array[j]
      else: # ์ž๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋‚˜๋ฉด ๊ทธ ์œ„์น˜์—์„œ ๋ฉˆ์ถค
        break

  return array

# ์‹œ๊ฐ„๋ณต์žก๋„: O(N^2)

์‚ฝ์ž… ์ •๋ ฌ์˜ ๊ฒฝ์šฐ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ธ์ž๋กœ ์ฃผ์—ˆ์„ ๋•Œ O(N)์— ์ž‘๋™ํ•œ๋‹ค. ์ด์–ด์„œ ๋‚˜์˜ฌ ํ€ต ์ •๋ ฌ๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ, ๋ณดํ†ต์˜ ๊ฒฝ์šฐ ์‚ฝ์ž… ์ •๋ ฌ์ด ๋” ๋น„ํšจ์œจ์ ์ด์ง€๋งŒ ์ •๋ ฌ์ด ๊ฑฐ์˜ ๋˜์–ด ์žˆ๋Š” ์ƒํ™ฉ์—์„œ๋Š” ๋” ๊ฐ•๋ ฅํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊ผญ ๊ธฐ์–ตํ•˜๊ณ  ์ž˜ ํ™œ์šฉํ•˜์ž!!!๐Ÿ˜Ž

 

 

 

 

ํ€ต ์ •๋ ฌ(Quick Sort)

๐Ÿ’ก ์•„์ด๋””์–ด

๊ธฐ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ทธ ๊ธฐ์ค€๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”๋ณด์ž!

 

 

๐Ÿ’ก ๋ถ„ํ•  ๊ณผ์ •

ํ€ต ์ •๋ ฌ์€ ๊ธฐ์ค€(pivot)์„ ์„ค์ •ํ•œ ๋‹ค์Œ ํฐ ์ˆ˜์™€ ์ž‘์€ ์ˆ˜๋ฅผ ๊ตํ™˜ํ•œ ํ›„, ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

ํ”ผ๋ฒ—์„ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ์‹์ด ์žˆ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” ๋Œ€ํ‘œ์ ์ธ ๋ถ„ํ•  ๋ฐฉ์‹์ธ ํ˜ธ์–ด ๋ถ„ํ• (Hoare Partition) ๋ฐฉ์‹์œผ๋กœ ํ”ผ๋ฒ—์„ ์ •ํ•˜๊ฒ ๋‹ค. ํ˜ธ์–ด ๋ถ„ํ•  ๋ฐฉ์‹์—์„œ๋Š” '๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ'๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ์ •ํ•œ๋‹ค. 

 

ํ”ผ๋ฒ—์„ ์„ค์ •ํ•œ ๋’ค์—๋Š” ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๊ณ , ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š”๋‹ค. ๊ทธ๋‹ค์Œ ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ฐ”๊พผ๋‹ค. ์ด ๊ณผ์ •์„ ์™ผ์ชฝ์—์„œ ์ถœ๋ฐœํ•œ ํฌ์ธํ„ฐ์™€ ์˜ค๋ฅธ์ชฝ์—์„œ ์ถœ๋ฐœํ•œ ํฌ์ธํ„ฐ๊ฐ€ ์—‡๊ฐˆ๋ฆด ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค. 

 

๋‘ ํฌ์ธํ„ฐ๊ฐ€ ์—‡๊ฐˆ๋ฆฐ ์‹œ์ ์—์„œ, ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋ฒ—์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ฐ”๊พผ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด ํ”ผ๋ฒ—์˜ ์™ผ์ชฝ์—๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋งŒ, ํ”ผ๋ฒ—์˜ ์˜ค๋ฅธ์ชฝ์—๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋งŒ ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค. ์ด ๊ณผ์ •์„ ๋ถ„ํ• (Divide) ๋˜๋Š” ํŒŒํ‹ฐ์…˜(Partition)์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

ํ”ผ๋ฒ—์— ๋”ฐ๋ผ ๋ถ„ํ• ๋œ ์ƒํƒœ์—์„œ ์™ผ์ชฝ ๋ฆฌ์ŠคํŠธ์™€ ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ •๋ ฌ์‹œํ‚ค๋Š” ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋‹ค ๋ณด๋ฉด ์ „์ฒด ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•˜์—ฌ ์ •๋ ฌ์ด ์ด๋ค„์ง€๊ฒŒ ๋œ๋‹ค. 

 

์ถœ์ฒ˜: https://gmlwjd9405.github.io/2018/05/10/algorithm-quick-sort.html

 

 

๐Ÿ’ก ์†Œ์Šค์ฝ”๋“œ

def quickSort(array):
  if len(array) <= 1:
    return array

  pivot = array[0]
  tail = array[1:]

  leftSide = [x for x in tail if x <= pivot]
  rightSide = [x for x in tail if x > pivot]

  return quickSort(leftSide) + [pivot] + quickSort(rightSide)

# ํ‰๊ท  ์‹œ๊ฐ„๋ณต์žก๋„: O(NlogN)
# ์ตœ์•…์˜ ๊ฒฝ์šฐ: O(N^2)

ํ€ต ์ •๋ ฌ์—์„œ ์ตœ์„ ์˜ ๊ฒฝ์šฐ๋Š” ํ”ผ๋ฒ—๊ฐ’์ด ์ •ํ™•ํžˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ ˆ๋ฐ˜์”ฉ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ•  ๊ฒฝ์šฐ์ด๋‹ค. ์ด ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(NlogN)์ด ๋œ๋‹ค. 

ํ€ต ์ •๋ ฌ์—์„œ ์ตœ์•…์˜ ๊ฒฝ์šฐ๋Š” ์ด๋ฏธ ์ •๋ ฌ๋œ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์—ˆ์„ ๋•Œ์ด๋‹ค. ์ด ๊ฒฝ์šฐ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N^2)์ด ๋œ๋‹ค. 

 

 

 

 

๊ณ„์ˆ˜ ์ •๋ ฌ(Count Sort)

๐Ÿ’ก ๊ณ„์ˆ˜ ์ •๋ ฌ์ด๋ž€?

๊ณ„์ˆ˜ ์ •๋ ฌ์€ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๊ฐ€ N, ๋ฐ์ดํ„ฐ ์ค‘ ์ตœ๋Œ“๊ฐ’์ด K์ผ ๋•Œ ์ˆ˜ํ–‰ ์‹œ๊ฐ„ O(N + K)๋ฅผ ๋ณด์žฅํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. 

 

ํ•˜์ง€๋งŒ ์–ธ์ œ๋‚˜ ์“ฐ๊ธฐ ์ ํ•ฉํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๊ณ , ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ ๋ฒ”์œ„๊ฐ€ ์ œํ•œ๋˜์–ด ์ •์ˆ˜ ํ˜•ํƒœ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ max๊ฐ’๊ณผ min๊ฐ’์˜ ์ฐจ์ด๊ฐ€ 1,000,000์„ ๋„˜์ง€ ์•Š์„ ๋•Œ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ณ„์ˆ˜ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ๋ชจ๋“  ๋ฒ”์œ„๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ์˜ ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

๊ณ„์ˆ˜ ์ •๋ ฌ์˜ ์ˆ˜ํ–‰ ๊ณผ์ •์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. 

  1. ๋ฐ์ดํ„ฐ์˜ (min, max) ๋ฒ”์œ„๋ฅผ ํฌํ•จํ•˜๋Š” ํ•˜๋‚˜์˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•จ
  2. ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์”ฉ ํ™•์ธํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ์˜ ๊ฐ’๊ณผ ๋™์ผํ•œ ์ธ๋ฑ์Šค์˜ ๊ฐ’์„ 1์”ฉ ์ฆ๊ฐ€์‹œํ‚ด
  3. ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ๊ทธ ๊ฐ’๋งŒํผ ์ธ๋ฑ์Šค๋ฅผ ์ถœ๋ ฅ

 

์ถœ์ฒ˜: https://www.programiz.com/dsa/counting-sort

 

 

๐Ÿ’ก ์†Œ์Šค์ฝ”๋“œ

def countSort(array):
  count = [0] * (max(array) + 1)

  for x in array:
    count[x] += 1

  result = []
  for i in range(len(count)):
    for j in range(count[i]):
      result.append(i)

  return result

# ์‹œ๊ฐ„๋ณต์žก๋„: O(N + K)

 

 

 

 

์ฐธ๊ณ ์ž๋ฃŒ: ์ด๊ฒƒ์ด ์ทจ์—…์„ ์œ„ํ•œ ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ๋‹ค with Python(๋‚˜๋™๋นˆ ์ €, ํ•œ๋น›๋ฏธ๋””์–ด)

 

 

 

 

728x90