๋ฐ์ํ
๐ ํต ์ ๋ ฌ(quick sort) ์ด๋
- ๋ถํ ์ ๋ณต์ ํ์ฉํ์ฌ ๊ตฌํํ๊ธฐ ๋๋ฌธ์ ์๊ฐ๋ณต์ก๋๋ O(nlogn) ํต์ด๋ ์ด๋ฆ์ ๋ง๊ฒ ๋น ๋ฅด๋ค.
-
๋ถํ ์ ๋ณต: ๋ฌธ์ ๋ฅผ ์์ 2๊ฐ์ ๋ฌธ์ ๋ก ๋ถ๋ฆฌํ๊ณ ๊ฐ๊ฐ ํด๊ฒฐํ ํ, ๋ค์ ๋ชจ์ ์๋์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ.
๋ณดํต ์ฌ๊ทํจ์ ํธ์ถ์ ์ด์ฉํ์ฌ ๊ตฌํ๋ค. - ๊ธฐ์ค ๊ฐ(pivot)์ ๊ธฐ์ค์ผ๋ก ๊ทธ ๊ฐ๋ณด๋ค ํฐ ๊ฐ๊ณผ ์์ ๊ฐ์ ์๋ก ๊ตํํ ๋ค ๊ธฐ์ค ๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋๊ฐ์ ๋ฆฌ์คํธ๋ก ๋๋๋ค. (๊ธฐ์ค ๊ฐ์ ์ผ์ชฝ์๋ ์์ ๊ฐ, ์ค๋ฅธ์ชฝ์๋ ํฐ ๊ฐ)
- ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์๋ ํต์ ๋ ฌ์ด ๊ฐ์ฅ ๋น ๋ฅด๋ค. (c์ธ์ด์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๋ ํต์ ๋ ฌ ๊ธฐ๋ฐ)
- ๋น๊ต ์ ๋ ฌ ( ๋ค๋ฅธ ์์์์ ๋น๊ต )
๐ ํต ์ ๋ ฌ(quick sort) ์์
- ๋งจ์์ ๊ฐ 3์ pivot ๊ฐ์ผ๋ก ์ค์ ํ๋ค ( ๋ณดํต ๊ฐ์ฅ ์์ ๊ฐ์ pivot์ผ๋ก ์ค์ )
- pivot๊ฐ์ ๋ฐ๋ก ์ค๋ฅธ์ชฝ๋ถํฐ ๋์ผ๋ก pivot๊ฐ๋ณด๋ค ํฐ ๊ฐ์ ํ์ ( 8์ ์ฐพ์ )
- ์ค๋ฅธ์ชฝ ๋งฝ ๋์์๋ถํฐ ์ผ์ชฝ์ผ๋ก pivot๊ฐ๋ณด๋ค ์์ ๊ฐ์ ํ์ ( 2 ์ฐพ์ )
- ๋์ ์๋ก ๊ตํํด์ค๋ค.
- ํฐ ๊ฐ (7), ์์ ๊ฐ (2)
- ํ์ง๋ง ์๋ก ์๊ฐ๋ ธ๋ค. ( ์์ ๊ฐ์ ์ธ๋ฑ์ค๊ฐ ํฐ ๊ฐ์ ์ธ๋ฑ์ค๋ณด๋ค ์์ ๊ฒฝ์ฐ)
- ์ด ๊ฒฝ์ฐ pivot๊ฐ๊ณผ ์์ ๊ฐ์ ๋ฐ๊ฟ์ค๋ค.
- ๊ทธ๋ฆฌ๊ณ pivot๊ฐ์ ์ด์ ๊ณ ์ ์ด๋ฉฐ, pivot๊ฐ์ ๊ธฐ์ค์ผ๋ก ๋๊ฐ์ ๋ฆฌ์คํธ๋ก ๋๋ ์ ์๋ค. ์ฌ๊ท ํธ์ถ์ ํตํด ์์ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค. ์ฌ๊ท๋ ๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ 1๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋๊น์ง ๋ฐ๋ณต.
- ์ฌ๊ท ํธ์ถ ํ๋ฒ์ ์ต์ํ ํ๋์ ์์๋ ์์น๊ฐ ์ ํด์ง๋ฏ๋ก, ์๊ณ ๋ฆฌ์ฆ์ด ๋ฐ๋์ ๋๋๋ ๊ฒ์ ๋ณด์ฅํ ์ ์๋ค.
- ์ผ์ชฝ์ ๋ฆฌ์คํธ๋ถํฐ ์ดํด๋ณด๋ฉด pivot (2), ์์๊ฐ(1) ํฐ ๊ฐ์ ์๋ค. ( ํฐ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ํฐ ๊ฐ์ ์ธ๋ฑ์ค๋ ์์ ๊ฐ์ ๋์ด๊ฐ์ ๊ฒ์ด๋ค. - ์๊ฐ๋ฆผ)
- pivot๊ฐ๊ณผ ์์๊ฐ์ ๋ฐ๊ฟ์ค๋ค. pivot(2)๋ ๊ณ ์
- pivot(1), ์์๊ฐ(0), ํฐ๊ฐ ์์
- pivot๊ณผ ์์๊ฐ์ ๋ฐ๊ฟ์ค๋ค. ๋ ๋ค ๊ณ ์
- ์ด์ ์ค๋ฅธ์ชฝ์ ๋ณด๋ฉด pivot(7), ํฐ ๊ฐ(8), ์์ ๊ฐ(6) ์ด๋ค. ํฐ ๊ฐ๊ณผ ์์ ๊ฐ ๊ตํ
- ๋ค์ pivot(7), ์์ ๊ฐ(4), ํฐ ๊ฐ(9) ํ์ง๋ง ์๊ฐ๋ฆผ
- pivot๊ณผ 4๋ฅผ ๊ตํ. pivot fix!
๐ ํต ์ ๋ ฌ(quick sort) ๊ตฌํ
def quick_sort(numbers, start, end):
if start >= end: # ์์๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ
return
pivot = start # pivot ๊ฐ์ฅ ์ผ์ชฝ์ ์์
i = start + 1
j = end
while i <= j: # ์๊ฐ๋ฆด ๋ ๊น์ง ๋ฐ๋ณต
while i <= j:
if numbers[i] >= numbers[pivot]: # pivot ๋ณด๋ค ํฐ ๊ฐ์ ๋ง๋ ๋
break
else:
i += 1
while j >= i:
if numbers[j] <= numbers[pivot]: # pivot ๋ณด๋ค ์์ ๊ฐ์ ๋ง๋ ๋
break
else:
j -= 1
if j < i: # ์๊ฐ๋ฆฌ๋ฉด pivot ๊ณผ ์์๊ฐ์ ๊ต์ฒด
numbers[pivot], numbers[j] = numbers[j], numbers[pivot]
else: # ์๊ฐ๋ฆฌ์ง ์์๋ค๋ฉด ํฐ๊ฐ(i)์ ์์๊ฐ(j)๋ฅผ ๊ต์ฒด
numbers[i], numbers[j] = numbers[j], numbers[i]
print(f'์ ๋ ฌ ์ค: {numbers}')
# ๊ต์ฒดํ ์์๊ฐ(j)๋ fix!! fix ๋ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์์ชฝ์ผ๋ก ๋๋ ์ ๋ถํ ์ ๋ณต
quick_sort(numbers, start, j - 1)
quick_sort(numbers, j + 1, end)
numbers = [3, 0, 1, 8, 7, 2, 5, 4, 9, 6]
print(f'์ ๋ ฌ ์ : {numbers}')
print()
quick_sort(numbers, 0, len(numbers) - 1)
print()
print(f'์ ๋ ฌ ํ: {numbers}')
๋ ๊ฐํธํ ๋ฐฉ๋ฒ
def quick_sort(numbers):
# ํผ๋ด์ ์ ํ๋ค. ๋งจ ๋ค ๊ฐ์ ์ ํ๋ค.
length = len(numbers)
if length <= 1:
return numbers
else:
pivot = numbers.pop()
low_numbers = []
high_numbers = []
for i in range(length - 1):
if numbers[i] > pivot:
high_numbers.append(numbers[i])
else:
low_numbers.append(numbers[i])
return quick_sort(low_numbers) + [pivot] + quick_sort(high_numbers)
nn = [9, 5, 1, 6, 8, 4, 2, 3, 7, 0]
print(f'์ ๋ ฌ ์ : {nn}')
print(f'์ ๋ ฌ ํ: {quick_sort(nn)}')
๐ ํต ์ ๋ ฌ(quick sort) ํน์ง
- ์ฅ์
- ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ค. O(nlogn) ๋ถํ ์ ๋ณต์ ์ฌ์ฉํ์ฌ ๋งค ๋จ๊ณ์์ ์ ์ด๋ 1๊ฐ์ ์์๊ฐ ์๋ฆฌ๋ฅผ ์ ํ๊ธฐ ๋๋ฌธ์ ์ ๋ ฌํ ๊ฐ์๊ฐ ์ค์ด๋ค๊ธฐ ๋๋ฌธ.
- ๋จ์
- ๋ถ์์ ์ ๋ ฌ - ๋์ผํ ๊ฐ์ ๋ํด์ ๊ธฐ์กด์ ์์๊ฐ ์ ์ง๋์ง ์๋๋ค.
๋ง์ฝ(A1, A3, A2, B, C)์ผ ๊ฒฝ์ฐ ์์๊ฐ A์ ์์๊ฐ ๋ฐ๋ ์ ์๋ค. - ์ต์
์ ๊ฒฝ์ฐ O(n^2)์ ์๊ฐ๋ณต์ก๋๊ฐ ๋์จ๋ค.
- ๋๋ถ๋ถ ์ ๋ ฌ๋ ์ํ๋ผ๋ฉด ๋ถํ ์ ๋ณต์ ์ด์ ์ ์ฌ์ฉํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ - ์ด๋ด ๋๋ ์ฝ์ ์ ๋ ฌ์ ์ฌ์ฉํด๋ณด์!!!
- ๋ pivot๊ฐ์ ์๋ชป ์ค์ ํ ๊ฒฝ์ฐ(์ด์ด ๋์๋ฉด) - ํฌ๊ธฐ๊ฐ ์ ๋นํ pivot๊ฐ์ ์ฐพ์์ ์ฌ์ฉ.
- ๋ถ์์ ์ ๋ ฌ - ๋์ผํ ๊ฐ์ ๋ํด์ ๊ธฐ์กด์ ์์๊ฐ ์ ์ง๋์ง ์๋๋ค.
๐ ํต ์ ๋ ฌ(quick sort) ์ฐธ๊ต์๋ฃ
๋ฐ์ํ
'CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ณ์ ์ ๋ ฌ(counting sort) (0) | 2020.09.26 |
---|---|
๋ณํฉ ์ ๋ ฌ(merge sort) (0) | 2020.09.25 |
์ฝ์ ์ ๋ ฌ(insertion sort) (0) | 2020.09.23 |
์ ํ ์ ๋ ฌ(selection sort) (0) | 2020.09.22 |
๋ฒ๋ธ ์ ๋ ฌ(bubble sort) (0) | 2020.09.21 |