Skip to content

Latest commit

ย 

History

History
223 lines (153 loc) ยท 7.48 KB

File metadata and controls

223 lines (153 loc) ยท 7.48 KB

์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜(Sorting Algorithm)

  • ์–ด๋–ค ์ •๋ ฌ์„ ์“ฐ๋ƒ์— ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋žจ์˜ ํšจ์œจ์„ฑ์ด ์ขŒ์ง€์šฐ์ง€๋  ์ˆ˜ ์žˆ๋‹ค.
  • ์ •๋ ฌ์€ ๋ฉด์ ‘ ๋‹จ๊ณจ ์งˆ๋ฌธ์ด๊ธฐ๋„ ํ•˜๋‹ค.
  • ๋ฒ„๋ธ” ์ •๋ ฌ, ์„ ํƒ ์ •๋ ฌ, ์‚ฝ์ž… ์ •๋ ฌ, ํ€ต ์ •๋ ฌ, ๊ณ„์ˆ˜ ์ •๋ ฌ, ๋ณ‘ํ•ฉ ์ •๋ ฌ, ํž™ ์ •๋ ฌ ์ •๋„๊นŒ์ง€๋Š” ์•Œ๊ณ  ์žˆ์œผ๋ฉด ์ข‹๋‹ค.

๋ฒ„๋ธ” ์ •๋ ฌ(Bubble Sort)

์™ผ์ชฝ๋ถ€ํ„ฐ ์ž๊ธฐ ์˜ค๋ฅธ์ชฝ ์š”์†Œ์™€ ๋น„๊ตํ•ด ๋ณธ์ธ์ด ๋” ํฌ๋ฉด swap ํ•œ ๋ฒˆ์˜ ์ˆœํšŒ๋งˆ๋‹ค ํฐ(์˜ค๋ฅธ์ชฝ) ์ž๋ฆฌ์˜ ์š”์†Œ๊ฐ€ ์ •ํ•ด์ง„๋‹ค.

์ฝ”๋“œ

def bubble_sort(array):
    for i in range(0, len(array)):
        for j in range(1, len(array)-i):
            if array[j-1] > array[j]:
                array[j-1], array[j] = array[j], array[j-1]

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

์ž‘๋‹ค๊ณ  ๋ฉˆ์ถ”๊ณ  ์ด๋Ÿฐ ๊ฒŒ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์„ ์˜ ๊ฒฝ์šฐ, ์ตœ์•…์˜ ๊ฒฝ์šฐ ๋ชจ๋‘ ๋™์ผํ•˜๊ฒŒ O(N^2)


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

์ˆœํšŒํ•˜๋ฉฐ ์ œ์ผ ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋งจ ์•ž์œผ๋กœ ์˜ฎ๊น€์œผ๋กœ์จ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ •๋ ฌ์„ ์™„์„ฑํ•ด๊ฐ€๋Š” ๋ฐฉ์‹ ํ•œ ๋ฒˆ์˜ ์ˆœํšŒ๋งˆ๋‹ค ์ž‘์€(์™ผ์ชฝ) ์ž๋ฆฌ์˜ ์š”์†Œ๊ฐ€ ์ •ํ•ด์ง„๋‹ค.

์ฝ”๋“œ

def selection_sort(array):
    for i in range(len(array)):
        min_index = i
        for j in range(i + 1, len(array)):
            if array[min_index] > array[j]:
                min_index = j
        array[i], array[min_index] = array[min_index], array[i]

array = [7, 3, 1, 5, 9]
selection_sort(array)
print(array)  # [1, 3, 5, 7, 9]

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

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์œ ๋กœ O(N^2)์ด๋‹ค.

  • (N-1) + (N-2) + ... + 2 = N(N+1)/2 ๋ผ์„œ
  • ๋ฐ˜๋ณต๋ฌธ์ด ๋‘ ๋ฒˆ ์ค‘์ฒฉ๋˜์—ˆ์œผ๋ฏ€๋กœ

๋”ฐ๋ผ์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ํ’€์ด์— ์‚ฌ์šฉํ•˜๊ธฐ์—๋Š” ์กฐ๊ธˆ ๋А๋ฆฌ๋‹ค.


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

2๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ, ์ž๊ธฐ ์™ผ์ชฝ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ํ™•์ธํ•ด ๋” ํฌ๋‹ค๋ฉด swap, ์ž์‹ ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ๋ฉˆ์ถค์œผ๋กœ์จ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ •๋ ฌ์„ ์™„์„ฑํ•ด๊ฐ€๋Š” ๋ฐฉ์‹ ํ•œ ๋ฒˆ์˜ ์ˆœํšŒ๋งˆ๋‹ค ์™ผ์ชฝ์˜ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ ์ˆ˜๊ฐ€ 1๊ฐœ์”ฉ ๋Š˜์–ด๋‚œ๋‹ค.

์‚ฝ์ž… ์ •๋ ฌ์€ ์›€์ง์ผ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด ์™ผ์ชฝ ์• ๋“ค์˜ ์ˆœ์„œ๋Š” ๋ชจ๋‘ ์ •๋ ฌ๋œ ์ƒํƒœ๋ผ๋Š” ์ „์ œ(์‹ค์ œ๋กœ ๊ทธ๋Ÿฌํ•˜๋‹ค)๋กœ ๋™์ž‘ํ•œ๋‹ค.

์ฝ”๋“œ

def insertion_sort(array):
    for i in range(1, len(array)):
        for j in range(i, 0, -1):
            if array[j] >= array[j - 1]:
                break
            array[j], array[j - 1] = array[j - 1], array[j]

array = [7, 3, 1, 5, 9]
insertion_sort(array)
print(array)  # [1, 3, 5, 7, 9]

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

์„ ํƒ ์ •๋ ฌ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ O(N^2)์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ตœ์„ ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(N)์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ์ •๋ ฌ๋œ ์ƒํƒœ์˜ ์ž๋ฃŒ์—์„œ ํšจ์œจ์ ์ด๋‹ค.


ํ€ต ์ •๋ ฌ(Quick Sort)

๊ธฐ์ค€ ๋ฐ์ดํ„ฐ(ํ”ผ๋ฒ—)๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ ์œผ๋กœ ์™ผ์ชฝ์—๋Š” ๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๊ฐ€, ์˜ค๋ฅธ์ชฝ์—๋Š” ๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ค๊ฒŒ ํ•˜๋Š” ๋ฐฉ์‹

์ฝ”๋“œ

  1. ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ ํ”ผ๋ฒ—์œผ๋กœ ์žก๊ณ  ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ, ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š”๋‹ค.
  2. ์ฐพ์€ ํ›„ ๋‘ ๋ฐ์ดํ„ฐ๊ฐ€ ์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด swap, ์—‡๊ฐˆ๋ ธ๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋ฒ—์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พผ๋‹ค.
  3. 2๋ฒˆ๊นŒ์ง€ ์ˆ˜ํ–‰ํ•˜๊ณ ๋‚˜๋ฉด ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์€ ๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๊ฐ€, ์˜ค๋ฅธ์ชฝ์€ ๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•˜๊ฒŒ ๋œ๋‹ค.
def quick_sort(array, start, end):
    if start >= end:
        return
    pivot = start
    left, right = start + 1, end
    while True:
        while left <= end:
            if array[pivot] < array[left]:
                break
            left += 1
        while right > start:
            if array[pivot] >= array[right]:
                break
            right -= 1
        if left >= right:
            break
        array[left], array[right] = array[right], array[left]
		array[pivot], array[right] = array[right], array[pivot]
    quick_sort(array, start, right - 1)
    quick_sort(array, right + 1, end)

array = [6, 4, 1, 3, 5, 0]
quick_sort(array, 0, len(array) - 1)
print(array)

ํŒŒ์ด์ฌ์— ํŠนํ™”๋œ ์ฝ”๋“œ

์–ด์จŒ๋“  ํ”ผ๋ฒ—์„ ์ •ํ•˜๊ณ  ํ”ผ๋ฒ—๋ณด๋‹ค ์™ผ์ชฝ์—๋Š” ์ž‘์€ ๋ฐ์ดํ„ฐ, ์˜ค๋ฅธ์ชฝ์—๋Š” ํฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ค๊ฒŒ ๋งŒ๋“  ๋’ค ์žฌ๊ท€๋กœ ๊ฐ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ๋™์ผํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ ์šฉํ•œ๋‹ค๋ฉด ํ€ต์†ŒํŠธ๋Š” ๋Œ์•„๊ฐ„๋‹ค.

์•„๋ž˜๋Š” ์ด๋Ÿฌํ•œ ์ ์—์„œ ์ฐฉ์•ˆํ•œ ํŒŒ์ด์ฌ์— ํŠนํ™”๋œ ์ฝ”๋“œ์ด๋‹ค.

์œ„์™€ ๋‹ฌ๋ฆฌ ๋ฐฐ์—ด ์ž์ฒด๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ •๋ ฌํ•œ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

def quick_sort(array):
		if len(array) <= 1: # ๋‘ ๊ฐœ๋ถ€ํ„ฐ ์žฌ๊ท€์— ๋“ค์–ด๊ฐ€๋ฏ€๋กœ
				return array
		pivot = array[0]
		tail = array[1:] # ์ด ๋ฌธ์žฅ์ด ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•ด์ง€๋Š” ๊ฒƒ (1๊ฐœ ์ดํ•˜๋ฉด ์—๋Ÿฌ ๋ฐœ์ƒ)
		left = [i for i in tail if i < pivot]
		right = [i for i in tail if i >= pivot]
		return quick_sort(left) + [pivot] + quick_sort(right)

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

์ตœ์„ ์˜ ๊ฒฝ์šฐ

  • ํ•ญ์ƒ ํ”ผ๋ฒ—์ด ์ •์ค‘์•™์— ์œ„์น˜ํ•˜๊ฒŒ ๋  ๋•Œ
  • ์ฆ‰, ํ•ญ์ƒ ์ •์ค‘์•™์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์—ด์„ ์ชผ๊ฐœ ์žฌ๊ท€์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒฝ์šฐ
  • ์ด ๋•Œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(NlogN)์ด๋‹ค.

์ตœ์•…์˜ ๊ฒฝ์šฐ

  • ๋ฐฐ์—ด์ด ํ•œ ์ชฝ์œผ๋กœ ์น˜์šฐ์ณ ์ชผ๊ฐœ์ ธ ๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ชผ๊ฐœ์ง€๋Š” ๊ฒฝ์šฐ
  • ์ด ๋•Œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N^2)์ด๋‹ค.

๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์ด ํ”ผ๋ฒ—์„ ์„ ์ •ํ•˜๋Š” ๊ฒฝ์šฐ ํ€ต ์ •๋ ฌ์€ ์˜คํžˆ๋ ค ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ์—์„œ ๋А๋ฆฌ๊ณ , ๋ฌด์ž‘์œ„ ๋ฐ์ดํ„ฐ์—์„œ ๋นจ๋ผ์ง„๋‹ค.

์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ ํ”ผ๋ฒ— ์„ ์ • ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ด์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค.


๊ณ„์ˆ˜ ์ •๋ ฌ

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ ์–ธํ•ด ๋“ฑ์žฅ ํšŸ์ˆ˜๋ฅผ ์„ธ๋Š” ๋ฐฉ์‹

์ง€๊ธˆ๊นŒ์ง€ ๋ณธ ์„ ํƒ, ์‚ฝ์ž…, ํ€ต ์ •๋ ฌ์€ ๋น„๊ต ๊ธฐ๋ฐ˜์˜ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๊ณ„์ˆ˜ ์ •๋ ฌ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์นด์šดํŠธํ•  ๋ฟ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ต ๊ธฐ๋ฐ˜์˜ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๋‹ค.

์ฝ”๋“œ

def counting_sort(array):
    new_array = []
    count = [0] * (max(array) + 1)
    for i in array:
        count[i] += 1
    for i in range(len(count)):
        for j in range(count[i]):
            new_array.append(i)
    return new_array

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

๋ฐ์ดํ„ฐ์˜ ๊ฐœ์ˆ˜ N๊ณผ ์ตœ๋Œ€๊ฐ’์˜ ํฌ๊ธฐ K์— ๋Œ€ํ•˜์—ฌ,

๋ฐฐ์—ด ๋Œ๋ฉด์„œ ๊ฐ ์š”์†Œ๋ณ„๋กœ count ์ฆ๊ฐ€ O(N)

0๋ถ€ํ„ฐ ์ตœ๋Œ€๊ฐ’ K๊นŒ์ง€ ๋Œ๋ฉด์„œ ์ˆœ์„œ๋Œ€๋กœ ์ƒˆ ๋ฐฐ์—ด์— ์‚ฝ์ž… O(K)

๋‘ ๊ฐœ๋ฅผ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ O(N + K)

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

0๊ณผ 999,999 ๋‹จ ๋‘ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด ๋งค์šฐ ๋น„ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ์˜ ํฌ๊ธฐ๊ฐ€ ์ž‘๊ณ  ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ์—๋Š” ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๋”ฐ๋ผ์„œ, ๋ณดํ†ต ์ค‘๋ณต ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๊ณ  ์ด๋“ค์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•œ๋‹ค.


์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ์œ ํ˜•

๋ฆฌ์ŠคํŠธ ์ž๋ฃŒ๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ ๊ฐ ๊ฐ’์ด ์šฐ์„ ๋„์˜ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ

์ •๋ ฌ์„ ํ†ตํ•ด ์šฐ์„ ์ˆœ์œ„๋ฅผ ๊ธฐ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์— ํ•ด๋‹นํ•œ๋‹ค.

๋ฆฌ์ŠคํŠธ ๋‚ด๋ถ€์˜ ๋ฆฌ์ŠคํŠธ or ํŠœํ”Œ (์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ •๋ ฌ ์กฐ๊ฑด)

์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ž˜ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค. ๋‚ด๊ฐ€ ๋ฐ˜๋ณต๋ฌธ ์ค‘์ฒฉ์„ ํ•ด๋„ ๋ ์ง€ ์•„๋‹์ง€ ๋“ฑ์„ ์ž˜ ์ƒ๊ฐํ•  ๊ฒƒ

  • ์ •๋ ฌ ์กฐ๊ฑด ๊ฐ„์˜ ์šฐ์„ ์ˆœ์œ„๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์—ญ์ˆœ์œผ๋กœ ์ ์šฉํ•œ๋‹ค. (์ฆ‰, ์šฐ์„ ๋„๊ฐ€ ๋‚ฎ์€ ์ •๋ ฌ ์กฐ๊ฑด์„ ๋จผ์ € ์ ์šฉ)
    • ์ด์œ : ๋จผ์ € ์ ์šฉํ•˜๋Š” ์กฐ๊ฑด์—์„œ ๊ฐ™์€ ์šฐ์„ ๋„๋ฅผ ๊ฐ–๋Š” ์• ๋“ค์— ๋‹ค์Œ ์กฐ๊ฑด์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ๋จผ์ € ์ ์šฉํ•  ์กฐ๊ฑด์„ ๋‚˜์ค‘์— ์ ์šฉํ•˜๋ฉด ์•ž์—์„œ ์ •๋ ฌ๋œ (๊ฐ™์€ ์šฐ์„ ๋„๋ฅผ ๊ฐ€์งˆ) ์• ๋“ค์˜ ์ˆœ์„œ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.