ํต ์ ๋ ฌ(Quick Sort)
- ๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ(์ ๋ณต ํ ๋ถํ )
- ๊ธฐ์ค ๋ฐ์ดํฐ(Pivot)๋ฅผ ์ค์ ํ๊ณ ๊ทธ ๊ธฐ์ค๋ณด๋ค ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ
- ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค ๋ฐ์ดํฐ(Pivot)๋ก ์ค์
ํต ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ํ๊ณผ์
ํต ์ ๋ ฌ์ ์ํํ ๋๋ ์ผ์ชฝ์์๋ถํฐ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ๊ณ ๋ฅด๊ณ , ์ค๋ฅธ์ชฝ์์๋ถํฐ ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ ๊ณ ๋ฆ
[Step 0]
- Pivot: 5
- ์ผ์ชฝ์์๋ถํฐ '5'๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๋ฏ๋ก '7'์ด ์ ํ๋จ
- ์ค๋ฅธ์ชฝ์์๋ถํฐ '5'๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๋ฏ๋ก '4'๊ฐ ์ ํ๋จ
- ๋ ๋ฐ์ดํฐ์ ์์น๋ฅผ ์๋ก ๋ณ๊ฒฝ
[Step 1]
- Pivot: 5
- ์ผ์ชฝ์์๋ถํฐ '5'๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๋ฏ๋ก '9'์ด ์ ํ๋จ
- ์ค๋ฅธ์ชฝ์์๋ถํฐ '5'๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๋ฏ๋ก '2'๊ฐ ์ ํ๋จ
- ๋ ๋ฐ์ดํฐ์ ์์น๋ฅผ ์๋ก ๋ณ๊ฒฝ
[Step 2]
- Pivot: 5
- ์ผ์ชฝ์์๋ถํฐ '5'๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๋ฏ๋ก '6'์ด ์ ํ๋จ
- ์ค๋ฅธ์ชฝ์์๋ถํฐ '5'๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๋ฏ๋ก '1'๊ฐ ์ ํ๋จ
- ์์น๊ฐ ์๊ฐ๋ฆฌ๋ ๊ฒฝ์ฐ ‘Pviot’๊ณผ ‘์์ ๋ฐ์ดํฐ’์ ์์น๋ฅผ ์๋ก ๋ณ๊ฒฝ
[๋ถํ ์๋ฃ]
- ‘5'์ ์ผ์ชฝ์ ์๋ ๋ฐ์ดํฐ๋ ๋ชจ๋ 5๋ณด๋ค ์๊ณ , ์ค๋ฅธ์ชฝ์ ์๋ ๋ฐ์ดํฐ๋ ๋ชจ๋ '5'๋ณด๋ค ํผ
- ๋ถํ (Divide): ์ด๋ ๊ฒ ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ ๋ฌถ์์ ๋๋๋ ์์
[์ผ์ชฝ ๋ฐ์ดํฐ ๋ฌถ์ ์ ๋ ฌ]
- ์ผ์ชฝ์ ์๋ ๋ฐ์ดํฐ์ ๋ํด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ๋ ฌ์ ์ํ
[์ค๋ฅธ์ชฝ ๋ฐ์ดํฐ ๋ฌถ์ ์ ๋ ฌ]
- ์ค๋ฅธ์ชฝ์ ์๋ ๋ฐ์ดํฐ์ ๋ํด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ๋ ฌ์ ์ํ
ํต ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์์ฌ์ฝ๋
QuickSort(A, left, right)
์
๋ ฅ: ๋ฐฐ์ด A[left]~A[right]
์ถ๋ ฅ: ์ ๋ ฌ๋ ๋ฐฐ์ด A[left]~A[right]
1. if (left < right) {
2. ํผ๋ด์ A[left]~A[right] ์ค์์ ์ ํํ๊ณ ,
ํผ๋ด์ A[left]์ ์๋ฆฌ๋ฅผ ๋ฐ๊พผ ํ,
ํผ๋ด๊ณผ ๋ฐฐ์ด์ ๊ฐ ์์๋ฅผ ๋น๊ตํ์ฌ ํผ๋ด๋ณด๋ค ์์ ์ซ์๋ค์ A[left]~A[p-1]๋ก ์ฎ๊ธฐ๊ณ ,
ํผ๋ด๋ณด๋ค ํฐ ์ซ์๋ค์ A[p+1]~A[right]๋ก ์ฎ๊ธฐ๋ฉฐ,
ํผ๋ด์ A[p]์ ๋๋๋ค.
3. QuickSort(A, left, p-1) // ํผ๋ด๋ณด๋ค ์์ ๊ทธ๋ฃน
4. QuickSort(A, p+1 right) // ํผ๋ด๋ณด๋ค ํฐ ๊ทธ๋ฃน
}
- Line 1
- ๋ฐฐ์ด A์ ๊ฐ์ฅ ์ผ์ชฝ ์์์ ์ธ๋ฑ์ค(left)๊ฐ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์์์ ์ธ๋ฑ์ค(right)๋ณด๋ค ์์ผ๋ฉด line2~4์์ ์ ๋ ฌ ์ํ
- ๋ง์ฝ ๊ทธ๋ ์ง ์์ผ๋ฉด 1๊ฐ์ ์์๋ฅผ ์ ๋ ฌํ๋ ๊ฒฝ์ฐ์. 1๊ฐ์ ์์๋ ์ด๋ฏธ ์ ๋ ฌ๋์ด ์์ผ๋ฏ๋ก ๊ทธ๋๋ก ํธ์ถ์ ๋ง์นจ.
- Line 2
- A[left]~A[right]์์ ํผ๋ด์ ์ ํํ๊ณ ,
- ๋ฐฐ์ด A[left+1]~A[right]์ ์์๋ค์ ํผ๋ด๊ณผ ๋น๊ตํ์ฌ,
- ํผ๋ด๋ณด๋ค ์์ ๊ทธ๋ฃน์ธ A[left]~A[p-1]๊ณผ ํผ๋ด๋ณด๋ค ํฐ ๊ทธ๋ฃน์ธ A[p+1]~A[right]๋ก ๋ถํ ํ๊ณ
- A[p]์ ํผ๋ด์ ์์น์ํจ๋ค.
- ์ฆ, p๋ ํผ๋ด์ด ์์นํ ๋ฐฐ์ด A์ ์ธ๋ฑ์ค์ด๋ค.
- Line 3: ํผ๋ด๋ณด๋ค ์์ ๊ทธ๋ฃน์ธ A[left]~A[p-1]์ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
- Line 4: ํผ๋ด๋ณด๋ค ํฐ ๊ทธ๋ฃน์ธ A[p+1]~A[right]์ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ
ํต ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ฝ๋
array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]
def quick_sort(array, start, end):
if start >= end: # ์์๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ ์ข
๋ฃ
return
pivot = start # ํผ๋ฒ์ ์ฒซ ๋ฒ์งธ ์์
left = start + 1
right = end
while(left <= right):
# ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋๊น์ง ๋ฐ๋ณต
while(left <= end and array[left] <= array[pivot]):
left += 1
# ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋๊น์ง ๋ฐ๋ณต
while(right > start and array[right] >= array[pivot]):
right -= 1
if(left > right): # ์๊ฐ๋ ธ๋ค๋ฉด ์์ ๋ฐ์ดํฐ์ ํผ๋ฒ์ ๊ต์ฒด
array[right], array[pivot] = array[pivot], array[right]
else: # ์๊ฐ๋ฆฌ์ง ์์๋ค๋ฉด ์์ ๋ฐ์ดํฐ์ ํฐ ๋ฐ์ดํฐ๋ฅผ ๊ต์ฒด
array[left], array[right] = array[right], array[left]
# ๋ถํ ์ดํ ์ผ์ชฝ ๋ถ๋ถ๊ณผ ์ค๋ฅธ์ชฝ ๋ถ๋ถ์์ ๊ฐ๊ฐ ์ ๋ ฌ ์ํ
quick_sort(array, start, right - 1)
quick_sort(array, right + 1, end)
quick_sort(array, 0, len(array) - 1)
print(array)
ํ์ด์ฌ์ ์ฅ์ ์ ์ด๋ฆฐ ๋ฐฉ์
array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]
def quick_sort(array):
# ๋ฆฌ์คํธ๊ฐ ํ๋ ์ดํ์ ์์๋ง์ ๋ด๊ณ ์๋ค๋ฉด ์ข
๋ฃ
if len(array) <= 1:
return array
pivot = array[0] # ํผ๋ฒ์ ์ฒซ ๋ฒ์งธ ์์
tail = array[1:] # ํผ๋ฒ์ ์ ์ธํ ๋ฆฌ์คํธ
left_side = [x for x in tail if x <= pivot] # ๋ถํ ๋ ์ผ์ชฝ ๋ถ๋ถ
right_side = [x for x in tail if x > pivot] # ๋ถํ ๋ ์ค๋ฅธ์ชฝ ๋ถ๋ถ
# ๋ถํ ์ดํ ์ผ์ชฝ ๋ถ๋ถ๊ณผ ์ค๋ฅธ์ชฝ ๋ถ๋ถ์์ ๊ฐ๊ฐ ์ ๋ ฌ์ ์ํํ๊ณ , ์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ๋ฐํ
return quick_sort(left_side) + [pivot] + quick_sort(right_side)
print(quick_sort(array))
์๊ฐ ๋ณต์ก๋
- ํผ๋ด ์ ํ์ด ์ข์ฐํจ. ๋๋ฌด ํฌ๊ฑฐ๋ ๋๋ฌด ์์ ์ซ์๊ฐ ์ ํ๋๋ฉด ํ ๋ถ๋ถ์ผ๋ก ์น์ฐ์น๋ ๋ถํ ์ ์ผ๊ธฐํจ
- ์ต์
์ ๊ฒฝ์ฐ: O(n^2)
- = (n-1)+(n-2)+(n-3)+…+2+1 = n(n-1)/2 = O(n^2)
- ํ๊ท ์ ๊ฒฝ์ฐ = ์ต์ ์ ๊ฒฝ์ฐ
- $$O(log_2{n})$$
์ฑ๋ฅ ํฅ์ ๋ฐฉ๋ฒ
- ์ ๋ ฅ์ ํฌ๊ธฐ๊ฐ ๋งค์ฐ ํด ๋, ํต ์ ๋ ฌ์ ์ฑ๋ฅ์ ๋ ํฅ์์ํค๊ธฐ ์ํด ์ฝ์ ์ ๋ ฌ์ ๋์์ ์ฌ์ฉ
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํด์ (0) | 2023.06.14 |
---|---|
์ ํ ๋ฌธ์ (Selection Problem) (0) | 2023.06.13 |
ํฉ๋ณ ์ ๋ ฌ(Merge Sort) (0) | 2023.06.13 |
๋ถํ ์ ๋ณต ์๊ณ ๋ฆฌ์ฆ(Divide and Conquer) (0) | 2023.06.13 |
๋ฒ๋ธ ์ ๋ ฌ(Bubble Sort) (0) | 2023.06.13 |