๋ฐ์ํ
๐ ํ ์ ๋ ฌ(heap sort) ์ด๋
- ํํธ๋ฆฌ๊ตฌ์กฐ๋ฅผ ์ด์ฉํ์ฌ ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ
ํํธ๋ฆฌ: ์ต์๊ฐ์ด๋ ์ต๋๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์๋ด๊ธฐ ์ํด ์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ํธ๋ฆฌ - ํ์ ๋ ฌ์ ํ๊ธฐ ์ํด์๋ ๋จผ์ ํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
ํํผํ์ด ์๊ณ ๋ฆฌ์ฆ์ ํตํด ํ๊ตฌ์กฐ๋ก ๋ง๋ ๋ค. - ๋ชจ๋ ์ ์ ์ ๋ํด์ ํํผํ์ด๋ฅผ ์ํํ๋ฏ๋ก n x logn ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
์ฌ์ค์ ๋ชจ๋ ์ ์ ์ด ์๋๋ผ ์ ๋ฐ์ ์ ์ ๋ง ํด๋ ๊ฐ๋ฅํ๋ค
n/2 x logn => (n/2์ด logn ๋ณด๋ค ํฌ๋ค๊ณ ๊ฐ์ ํ ๋) => ๊ฒฐ๊ตญ O(n) ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
๐ ํ ์ ๋ ฌ(heap sort) ๊ตฌํ
# (์ต๋)ํ ๊ตฌ์กฐ ๋ง๋ค๊ธฐ
def heapify():
for i in range(1, N):
c = i
while c > 0:
root = (c - 1) // 2
if numbers[c] > numbers[root]:
numbers[c], numbers[root] = numbers[root], numbers[c]
c = root
return
# ํ ์ ๋ ฌํ๊ธฐ(์ค๋ฆ์ฐจ์)
def heap_sort():
for i in range(N - 1, -1, -1): # n
# ๋งจ ์๊ณผ ๋งจ ๋ค๋ฅผ ๊ตํ! ( ๊ฐ์ฅ ํฐ ์๋ฅผ ๋ค๋ก ๋ณด๋ธ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ฐ์ฅ ํฐ ์๋ FIX!!!! )
numbers[0], numbers[i] = numbers[i], numbers[0]
# ํ๊ตฌ์กฐ๊ฐ ์ด์ํด์ก์ผ๋ฏ๋ก ๋ค์ ํ๊ตฌ์กฐ๋ก ๋ฐ๊พผ๋ค. # logn
root, c = 0, 1
while c < i:
c = root * 2 + 1
if c < i - 1 and numbers[c] < numbers[c + 1]:
c += 1
if c < i and numbers[c] > numbers[root]:
numbers[c], numbers[root] = numbers[root], numbers[c]
root = c
return
numbers = [2, 7, 3, 4, 5, 6, 1]
N = len(numbers)
heapify()
print(numbers)
heap_sort()
print(numbers)
๐ ํ ์ ๋ ฌ(heap sort) ํน์ง
- ์ฅ์
- ์ถ๊ฐ์ ์ธ ๋ฐฐ์ด์ด ํ์ํ์ง ์๋ค.( in-palce algorithm, ๋ณํฉ์ ๋ ฌ๋ณด๋ค ํจ์จ์ )
- ํญ์ nlogn์ ๋ณด์ฅ
- ์ด๋ก ์ ํต,๋ณํฉ ์ ๋ ฌ๋ณด๋ค ์ฐ์์ ์๋ค.
- max ๋๋ min ๊ฐ์ ๊ตฌํ ๋ ์๊ฐ ๋ณต์ก๋๋ O(1)์ด๋ค.
- ๋จ์
- ์ผ๋ฐ์ ์ผ๋ก ์๋๋ง ๋น๊ตํ์๋ฉด ํต์ด ํ๊ท ์ ์ผ๋ก ๋ ๋น ๋ฅด๋ค. ๊ทธ๋์ ์ ์ฌ์ฉํ์ง ์์.
๐ ํ ์ ๋ ฌ(heap sort) ์ฐธ๊ต์๋ฃ
๋ฐ์ํ
'CS > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๋น๊ต (0) | 2020.10.08 |
---|---|
์์ ์ ๋ ฌ(topology sort) (0) | 2020.10.05 |
ํ๋ก์ด๋ ์์ฌ(Floyd Warshall) (0) | 2020.10.04 |
์๋ผํ ์คํ ๋ค์ค์ ์ฒด(Sieve Of Eratosthenes) (0) | 2020.10.03 |
๋ค์ต์คํธ๋ผ(dijkstra) (0) | 2020.10.02 |