ํฐ์คํ ๋ฆฌ ๋ทฐ
์ ํ ์ ๋ ฌ, ๋ฒ๋ธ ์ ๋ ฌ, ์ฝ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ชจ๋ ์๊ฐ ๋ณต์ก๋ O(N^2)์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ๊ฐ ์ปค์ง๋ฉด ์ฌ์ฉํ๊ธฐ๊ฐ ์ด๋ ค์ด ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ๊ทธ๋์ ๋์ฑ ๋น ๋ฅธ ์ ๋ ฌ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉ๋ ํ์๊ฐ ์๋ค.
ํต ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋ํ์ ์ธ '๋ถํ ์ ๋ ฌ' ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ๊ท ์๋๊ฐ O(N * logN)์ด๋ค.
ํต ์ ๋ ฌ์ ํ๋์ ํฐ ๋ฌธ์ ๋ฅผ ๋๊ฐ์ ์์ ๋ฌธ์ ๋ก ๋ถํ ํ๋ ์์ผ๋ก ๋น ๋ฅด๊ฒ ์ ๋ ฌํ๋ค. ํน์ ํ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ํฐ ์ซ์์ ์์ ์ซ์๋ฅผ ์๋ก ๊ตํํ ๋ค์ ๋ฐฐ์ด์ ๋ฐ์ผ๋ก ๋๋๋ค.
ํน์ ํ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ํฐ ์ซ์์ ์์ ์ซ์๋ฅผ ๋๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ํต์ ๋ ฌ์์๋ ๊ธฐ์ค๊ฐ์ด ์๋ค. ์ด๋ฅผ ํผ๋ฒ(Pivot)์ด๋ผ ํ๋ค. ๋ณดํต ๊ฐ์ฅ ์์ ์๋ ๊ฐ์ ํผ๋ฒ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ค.
3 7 8 1 5 9 6 10 2 4 -> 3 2 8 1 5 9 6 10 7 4
์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋ํ ๋๋ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ์ ์ ํ => 7
์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ด๋ํ ๋๋ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ์ ์ ํ => 2
์ ํ๋ ๋ ๊ฐ์ ์์น๋ฅผ ๊ต์ฒดํ๋ค.
3 2 8 1 5 9 6 10 7 4 -> 3 2 1 8 5 9 6 10 7 4
์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ์ ์ ํ => 8
์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ์ ์ ํ => 1
์ ํ๋ ๋ ๊ฐ์ ์์น๋ฅผ ๊ต์ฒดํ๋ค.
3 2 1 8 5 9 6 10 7 4 -> 1 2 3 8 5 9 6 10 7 4
์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ์ ์ ํ => 8
์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ์ ์ ํ => 1
8๊ณผ 1์ ์๋ก ์๊ฐ๋ฆฐ ์ํฉ(์์๊ฐ์ ์ธ๋ฑ์ค๊ฐ ํฐ๊ฐ์ ์ธ๋ฑ์ค๋ณด๋ค ๋ ์์ ์ํฉ)
์์๊ฐ๊ณผ ํผ๋ฒ์ ์์น๋ฅผ ๋ฐ๊ฟ์ค๋ค.
1 2 3 8 5 9 6 10 7 4
3์ ์ ๋ ฌ์ด ์ด๋ฃจ์ด์ง ์ํ (3์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ์ 3๋ณด๋ค ์์ ์, ์ค๋ฅธ์ชฝ์ 3๋ณด๋ค ํฐ ์)
์ด ์ํ์์ 3์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ์์ ๋ค์ ์ ๋ ฌ ์ค๋ฅธ์ชฝ์์ ๋ค์ ์ ๋ ฌํ๋ค.
1 2 3 8 5 9 6 10 7 4 -> 1 2 3 8 5 9 6 10 7 4
ํผ๋ฒ๊ฐ 1
์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ => 2
์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ => ์์ ์ด ๊ฒฝ์ฐ์๋ ์๊ธฐ ์์ ์ ๊ณ ๋ฆ => 1
์๊ฐ๋ฆฐ ์ํฉ -> ํผ๋ฒ๊ฐ๊ณผ ์์ ๊ฐ์ ์์น๋ฅผ ๋ฐ๊ฟ์ค๋ค.
1 2 3 8 5 9 6 10 7 4
1์ ์ ๋ ฌ์ด ์ด๋ฃจ์ด์ง ์ํ
ํผ๋ฒ๊ฐ 2
๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ์ ๋ ฌํ ๊ฒ์ด ์์
1 2 3 8 5 9 6 10 7 4 -> 1 2 3 8 5 4 6 10 7 9
ํผ๋ฒ๊ฐ 8
์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ => 9
์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ => 4
์ ํ๋ ๋ ๊ฐ์ ์์น๋ฅผ ๋ฐ๊พผ๋ค.
1 2 3 8 5 4 6 10 7 9 -> 1 2 3 8 5 4 6 7 10 9
์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ => 10
์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ => 7
์ ํ๋ ๋ ๊ฐ์ ์์น๋ฅผ ๋ฐ๊พผ๋ค.
1 2 3 8 5 4 6 7 10 9 -> 1 2 3 7 5 4 6 8 10 9
์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ => 10
์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ => 7
์๊ฐ๋ฆฐ ์ํฉ -> ํผ๋ฒ๊ฐ๊ณผ ์์ ๊ฐ์ ์์น๋ฅผ ๋ฐ๊ฟ์ค๋ค.
1 2 3 7 5 4 6 8 10 9 -> 1 2 3 6 5 4 7 8 10 9
ํผ๋ฒ๊ฐ 7
์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ => ์์ -> ํผ๋ฒ๊ฐ์ผ๋ก ์ค์ 7
์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ => 6
์๊ฐ๋ฆฐ ์ํฉ -> ํผ๋ฒ๊ฐ๊ณผ ์์ ๊ฐ์ ์์น๋ฅผ ๋ฐ๊พผ๋ค.
1 2 3 6 5 4 7 8 10 9
์ด๋ฐ์์ผ๋ก ๋ฐ๋ณต์ ํ๋ค.
๊ทธ๋ผ ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ด ์ ๋ ฌ์ด ๋๋ค.
1 2 3 4 5 6 7 8 9 10
ํต ์ ๋ ฌ์ด ๊ฐ๋ ฅํ ์ด์ ๋ฅผ ์ง๊ด์ ์ผ๋ก ์ค๋ช ์ ํด๋ณด์๋ฉด ๊ธฐ์กด ์ ํ, ๋ฒ๋ธ, ์ฝ์ ์ ๋ ฌ ๊ฐ์ ๊ฒฝ์ฐ 10๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๋ค๊ณ ํ์ ๋ 100๋ฒ์ ์ฐ์ฐ์ด ํ์ํ๋ค.
1 2 3 4 5 6 7 8 9 10
N ^ 2 = 10 * 10 = 100
ํต ์ ๋ ฌ์ ๋ถํ ๋ก ์ ๋ ฌ ์ฐ์ฐ์ ํ๊ธฐ ๋๋ฌธ์ ๊ธฐ์กด์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ๋ณด๋ค ๋ ์์ ์ฐ์ฐ์ด ํ์ํ๋ค. ์ด๋ฌํ ์๋ฆฌ๋ก ํต ์ ๋ ฌ์ด ๋น ๋ฅด๊ฒ ์ฐ์ฐ์ ํ ์ ์๋ค.
1 2 3 4 5 / 6 7 8 9 10
5 * 5 + 5 * 5 = 50
ํ์ด์ฌ ์ฝ๋
# ํต ์ ๋ ฌ (Quick Sort)
# ํน์ ํ ํผ๋ฒ๊ฐ์ ์ด์ฉํด์ ํผ๋ฒ๊ฐ๋ณด๋ค ํฐ๊ฐ๊ณผ ์์๊ฐ์ ๋ฐ๋ณต์ ์ผ๋ก ๋ฐ๊พธ์ด์ฃผ๋ ์ฐ์ฐ
# ๊ฒฐ๊ณผ์ ์ผ๋ก ํผ๋ฒ๊ฐ๋ณด๋ค ์์ ๊ฐ์ ์ผ์ชฝ, ํฐ๊ฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ๋ถํ ์ด ๋๋ค
# ์ค์ ๋ก ์์ค์ฝ๋์์์๋ ์ฌ๊ทํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
def quick_sort(data, start, end):
# start๋ ์ ๋ ฌ์ ์ํํ๋ ๋ถ๋ถ์งํฉ์ ์ฒซ๋ฒ์งธ ๊ฐ end๋ ๋ง์ง๋ง ๊ฐ
if start >= end: # ์์๊ฐ ํ๊ฐ์ธ ๊ฒฝ์ฐ
return
# key๋ ํผ๋ด๊ฐ์ผ๋ก ์ฒซ๋ฒ์งธ ์์๊ฐ์ผ๋ก ์ก์์ค๋ค
key = start
# ํ์ํ๊ธฐ์ํ ๋ณ์๋ค
i = start + 1 # ์ผ์ชฝ ์ถ๋ฐ ์ง์
j = end # ์ค๋ฅธ์ชฝ ์ถ๋ฐ ์ง์
while i <= j: # ์๊ฐ๋ฆด ๋๊น์ง ๋ฐ๋ณต
# ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
while i <= end and data[i] <= data[key]: # ํค๊ฐ๋ณด๋ค ํฐ ๊ฐ์ ๋ง๋ ๋๊น์ง ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋์ํจ๋ค.
i = i + 1
# ์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ์ด๋
while data[j] >= data[key] and j > start: # ํค๊ฐ๋ณด๋ค ์์ ๊ฐ์ ๋ง๋ ๋๊น์ง ์ผ์ชฝ์ผ๋ก ์ด๋์ํจ๋ค.
j = j - 1
# ๊ต์ฒดํ๋ ๋ก์ง
if i > j: # ์๊ฐ๋ฆฐ ์ํ๋ฉด ํค๊ฐ๊ณผ ์์ ๊ฐ์ ๊ต์ฒด
temp = data[j]
data[j] = data[key]
data[key] = temp
else: # ์๊ฐ๋ฆฌ์ง ์์๋ค๋ฉด ํฐ ๊ฐ๊ณผ ์์ ๊ฐ์ ๊ต์ฒด
temp = data[i]
data[i] = data[j]
data[j] = temp
# ์ ๋ ฌ์ด ๋๋๋ฉด ๊ฐ๊ฐ ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ ์ ๋ ฌ์ ์คํํด์ค๋ค.
quick_sort(data, start, j - 1)
quick_sort(data, j + 1, end)
return data
test = [3, 7, 8, 1, 5, 9, 6, 10, 2, 4]
print("์ ๋ ฌ๋ ๋ฐ์ดํฐ : {}".format(quick_sort(test, 0, len(test)-1)))
ํต ์ ๋ ฌ์ ๋จ์
ํต ์ ๋ ฌ์ ํ๊ท ์๊ฐ ๋ณต์ก๋๋ O(N * logN)์ด๋ค. ํ์ง๋ง ํผ๋ฒ๊ฐ์ ๋ฌด์์ผ๋ก ์ค์ ํ๋์ง์ ๋ฐ๋ผ์ ์ต์ ์๊ฐ ๋ณต์ก๋๊ฐ O(N^2) ๊ฐ ๋์จ๋ค๋ ๋จ์ ์ด ์๋ค.
์ด๋ฏธ ์ ๋ ฌ์ด ๋์ด์๋ ๊ฒฝ์ฐ๋ฅผ ์๊ฐํด๋ณด์.
1 2 3 4 5 6 7 8 9 10 -> 1 2 3 4 5 6 7 8 9 10
์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ๊ฐ ๋ ํผ๋ฒ๊ฐ๋ณด๋ค ํฐ ๊ฐ -> 2
์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ๊ฐ ๋ ํผ๋ฒ๊ฐ๋ณด๋ค ์์ ๊ฐ -> ์์ -> 1
์ค๋ฅธ์ชฝ์์ ์ผ์ชฝ์ผ๋ก ๊ฐ ๋ ํผ๋ฒ๊ฐ๋ณด๋ค ์์ ๊ฐ์ ์ฐพ์ง ๋ชปํด์ 1๊น์ง ์ค๊ฒ ๋๋ค. ์ฐ์ฐ์ด 10๋ฒ ๋ฐ์ํ๋๋ฐ ์ ๋ ฌ์ ๊ณ ์ 1ํ๋๋ง ์๋ฃํ๊ฒ ๋๋ค. ๋ค์ ์ฐ์ฐ์ ํ ๋์๋ 9๋ฒ, 8๋ฒ ... ๋ฐ์ํ๊ณ ๋ถํ ์ ๋ ฌ์ ์ด์ ์ ์ฌ์ฉํ์ง ๋ชปํด์ ์๊ฐ ๋ณต์ก๋๊ฐ O(N * N)์ด ๋๋ค.
์ด ๊ฒฝ์ฐ์๋ ์ฝ์ ์ ๋ ฌ์ด ๋ ๋น ๋ฅด๋ค.
์ ๋ ฌํ ๋ฐ์ดํฐ์ ํน์ฑ์ ๋ฐ๋ผ์ ์ ์ ํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํ๋ค.
ํต ์ ๋ ฌ ์์ค์ฝ๋์์ ๋จ ๋ ๋ถ๋ถ๋ง ๋ฐ๊พธ์ด์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ๋ฐ๊พธ์ด ๋ณด์.
while i <= end and data[i] >= data[key]:
i = i + 1
while data[j] <= data[key] and j > start:
j = j - 1
'(๊ตฌ)์๋ฃ๊ตฌ์กฐ&์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ๋ณํฉ ์ ๋ ฌ (Merge Sort) (0) | 2020.06.17 |
---|---|
[๋ฐฑ์ค] Python - ์ ์ ๋ ฌํ๊ธฐ (0) | 2020.06.16 |
[Python] ์ฝ์ ์ ๋ ฌ (Insertion Sort) (0) | 2020.06.16 |
[Python] ๋ฒ๋ธ ์ ๋ ฌ (Bubble sort) (0) | 2020.06.16 |
[Python] ์ ํ ์ ๋ ฌ (Selection Sort) (0) | 2020.06.16 |
- Total
- Today
- Yesterday
- ์จ๋ฆฌ์์ค
- ์๋ฃ๊ตฌ์กฐ
- java ํ๊ฒฝ๋ณ์
- ๊ฒ์๋ฌผ์กฐํ
- ๊ฒ์ํ ์กฐํ
- ๊ฐ๋ฐ
- ์๋ฐ
- ๋ณ๋ช ์ฒ๋ฆฌ
- ์ดํด๋ฆฝ์ค ํ๊ธ ์ธ์ฝ๋ฉ
- mysql์ค์น
- ์ดํด๋ฆฝ์ค ์ค์น
- ์คํ๋ง๋ถํธ ์๋์์ฑ
- ๊ฒ์ํ ์ญ์
- ์ ์ฒด๊ฒ์๋ฌผ ์กฐํ
- Algorithm
- Java
- ๋ถํธ ์๋์์ฑ
- ๊ฒ์ํ๋ง๋ค๊ธฐ
- java jdk ์ค์น
- ์๊ณ ๋ฆฌ์ฆ
- ๊ฒ์๋ฌผ ์ญ์
- tomcat์ค์น
- typeAliases
- ๊ฐ๋ฐํ๊ฒฝ๊ตฌ์ถ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |