Quick Sort
์ฃผ์ด์ง ๋ฐฐ์ด์ ๋ ๊ฐ๋ก ๋ถํ ํ๊ณ , ๊ฐ๊ฐ์ ์ ๋ ฌํ๋ค
๋ณํฉ ์ ๋ ฌ๊ณผ ๋ค๋ฅธ ์
๋ณํฉ ์ ๋ ฌ์ ๊ทธ๋ฅ ๋ ๋ถ๋ถ์ผ๋ก ๋๋๋ ๋ฐ๋ฉด์, ํต ์ ๋ ฌ์ ๋ถํ ํ ๋, ๊ธฐ์ค ์์ดํ (pivot item) ์ค์ฌ์ผ๋ก, ์ด๋ณด๋ค ์์ ๊ฒ์ ์ผํธ, ํฐ ๊ฒ์ ์ค๋ฅธํธ์ ์์น์ํจ๋ค
๊ฐ ๋ถ๋ถ ์ ๋ ฌ์ด ๋๋ ํ, ๋ณํฉ์ ๋ ฌ์ "๋ณํฉ"์ด๋ ํ์ฒ๋ฆฌ ์์ ์ด ํ์ํ๋, ํต ์ ๋ ฌ์ ํ์๋ก ํ์ง ์๋๋ค.
์๊ฐ ๋ณต์ก๋
nlogn
Hoare-Partition ์๊ณ ๋ฆฌ์ฆ
์์ด๋์ด
P(pivot) ๊ฐ๋ค ๋ณด๋ค ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ, ์์ ๊ฐ๋ค์ ์ผ์ชฝ ์งํฉ์ ์์นํ๋๋ก ํ๋ค
Pivot์ ๋ ์งํฉ์ ๊ฐ์ด๋ฐ์ ์์น์ํจ๋ค
ํผ๋ด ์ ํ
์ผ์ชฝ ๋ / ์ค๋ฅธ์ชฝ ๋ / ์์์ ์ธ ๊ฐ ๊ฐ ์ค์ ์ค๊ฐ ๊ฐ
ex)
def quick_sort (arr, left, right):
# pivot ์์น ๊ฒฐ์ (pivot์ ๊ธฐ์ค์ผ๋ก ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ, ์์ ๊ฐ์ ์ผ์ชฝ์ผ๋ก ๊ตฌ๋ถ)
# ์ผ์ชฝ ๋ถ๋ถ์งํฉ ์ ๋ ฌ
# ์ค๋ฅธ์ชฝ ๋ถ๋ถ์งํฉ ์ ๋ ฌ
if left > right:
return
# ํผ๋ด ๊ตฌํ๊ธฐ
pivot = lomuto_partition(arr, left, right)
pivot = hoare_partition(arr, left, right)
# ์ผ์ชฝ ๋ถ๋ถ์งํฉ ์ ๋ ฌ ์คํ
quick_sort(arr, left, pivot-1)
# ์ค๋ฅด์ชฝ ๋ถ๋ถ์งํฉ ์ ๋ ฌ ์คํ
quick_sort(arr,pivot+1, right)
def lomuto_partition(arr, left, right):
# ๋งจ ์ค๋ฅธ์ชฝ ์์๋ฅผ pivot์ผ๋ก ์ค์ ํ๊ณ ,
# i = left -1
# j = left
pivot = arr[right]
i = left -1
for j in range(left, right):
# arr[i] ๊ฐ pivot๋ณด๋ค ์์ผ๋ฉด,
if arr[j] < pivot:
# i๋ฅผ 1 ์ฆ๊ฐ
# arr[j], arr[i] ์์น ๊ตํ
i += 1
arr[i], arr[j] = arr[j], arr[i]
# i๊ฐ ๊ฐ๋ฆฌํค๋ ์์น๊ฐ pivot๋ณด๋ค ์์ ๊ฐ์ ๋ง์ง๋ง ์ธ๋ฑ์ค
# i + 1 ์ ์์น์ pivot์ ๋๊ณ i+1 ๋ฐํ
arr[i+1], arr[right] = arr[right], arr[i+1]
return i+1
def hoare_partition(arr, left, right):
# i, j ์ค์ ํ๊ณ , ํฐ๊ฐ & ์์ ๊ฐ ์ฐพ์์ ์์น ๋ฐ๊ฟ์ฃผ๊ธฐ
i = left
j = right
pivot = arr[left]
# i๊ฐ j๋ณด๋ค ์์ ๋ ๊น์ง ๊ฒ์ํด์ ๋ฐ๋ณต
while i <= j:
# pivot ๋ณด๋ค ํฐ ๊ฐ์ด ๋์ฌ ๋ ๊น์ง i ์ฆ๊ฐ
while i<=j and arr[i] <= pivot:
i += 1
# pivot ๋ณด๋ค ์์ ๊ฐ์ด ๋์ฌ ๋ ๊น์ง j ๊ฐ์
while i <=j and arr[j] >= pivot:
j -= 1
# i๊ฐ j๋ณด๋ค ์์ผ๋ฉด, ์์น ๊ตํ
if i < j:
arr[i], arr[j] = arr[j], arr[i]
arr[left], arr[j] = arr[j], arr[left]
return j # pivot ์์น์ธ j ๋ฐํ
arr = [4,6,3,6,8,0,3,8,10]
quick_sort(arr, 0, len(arr)-1)
print(arr)
Last updated
Was this helpful?