CS/Algorithm

ํž™ ์ •๋ ฌ(heap sort)

deo2kim 2020. 10. 6. 20:38
๋ฐ˜์‘ํ˜•

๐Ÿ“” ํž™ ์ •๋ ฌ(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) ์ฐธ๊ต์ž๋ฃŒ

 

๋ฐ˜์‘ํ˜•