[μ •λ ¬] νž™ μ •λ ¬

νž™

νž™μ •λ ¬μ„ μ΄ν•΄ν•˜κΈ° 전에 νž™μ— λŒ€ν•œ 이해가 ν•„μš”ν•˜λ‹€.  νž™μ„ μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„  λ‹€μŒ 포슀트λ₯Ό ν™•μΈν•΄λ³΄μž. 

https://ybdeveloper.tistory.com/132

 

νž™ μ •λ ¬μ΄λž€? 

Max Heap, Min Heap을 ꡬ성해 μ •λ ¬ν•˜λŠ” 방법이닀. 
λ‚΄λ¦Όμ°¨μˆœ 정렬을 μœ„ν•΄μ„œλŠ” Max Heap, μ˜€λ¦„μ°¨μˆœ 정렬을 μœ„ν•΄μ„œλŠ” Min Heap을 κ΅¬μ„±ν•˜λ©΄ λœλ‹€. 
즉, 데이터듀을 Max Heapμ΄λ‚˜ Min Heap ν˜•νƒœλ‘œ μœ μ§€ν•œ 채 루트 λ…Έλ“œμ˜ 데이터λ₯Ό 뽑아내 정렬을 ν•˜λŠ” 방식이닀. 

 

νž™ μ •λ ¬ κ΅¬ν˜„ (λ‚΄λ¦Όμ°¨μˆœ) 

1. n개의 데이터에 λŒ€ν•΄ λ°˜λ³΅ν•œλ‹€.  O(n) 
  1-1. 배열에 데이터λ₯Ό μ‚½μž…ν•˜λ©° Max-Heap νŠΉμ„±μ„ λ§Œμ‘±ν•˜λ„λ‘ μ‘°μ •ν•œλ‹€. O(lgn)
2. Max-Heap에 데이터가 μ‘΄μž¬ν•˜μ§€ μ•Šμ„ λ•Œ κΉŒμ§€ 데이터λ₯Ό 뽑아낸닀.  O(n)  

 

νž™ μ •λ ¬ JAVA둜 κ΅¬ν˜„ν•˜κΈ°

    public void insert(int n) {
        heap[idx] = n;
        int parent = idx/2;
        int child = idx;
        while(child >= 2 && heap[parent] < heap[child]) {
            SWAP(parent, child);
            child = parent;
            parent = child/2;
        }
        idx++;
    }

    public int delete() {
        int data = heap[1];
        heap[1] = heap[idx--];
        int parent = 1;
        int child = 2;
        while(child <= idx && heap[parent] < heap[child]) {
            SWAP(parent, child);
            parent = child;
            child = heap[heap[parent * 2] < heap[parent * 2 + 1] ? parent * 2 + 1 : parent * 2];
        }
        return data;
    }

    public void SWAP(int idx1, int idx2) {
        int temp = heap[idx1];
        heap[idx1] = heap[idx2];
        heap[idx2] = temp;
    }

μœ„ μ½”λ“œλŠ” Max Heap을 κ΅¬ν˜„ν•œ μ½”λ“œμ΄λ‹€. Max Heap은 데이터λ₯Ό μ‚½μž…ν•˜κ±°λ‚˜, μ‚­μ œν•΄λ„ νŠΉμ„±μ„ μœ μ§€ν•˜κ³  μ΅œμƒλ‹¨ 루트 λ…Έλ“œμ—λŠ” κ°€μž₯ 큰 값을 가진 λ…Έλ“œκ°€ μœ„μΉ˜ν•˜κ²Œ λœλ‹€. λ”°λΌμ„œ νž™ 정렬을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹¨μˆœνžˆ νž™μ˜ νŠΉμ„±μ„ ν™œμš©ν•˜μ—¬ κ°€μž₯ 맨 μœ„μ— μžˆλŠ” 루트 λ…Έλ“œμ˜ 데이터λ₯Ό 가져와 좜λ ₯ μ‹œμΌœμ£ΌκΈ°λ§Œ ν•˜λ©΄ μ •λ ¬λœ 데이터λ₯Ό 얻을 수 μžˆλ‹€. 

 

이λ₯Ό κ΅¬ν˜„ν•œ μ½”λ“œλŠ” μ•„λž˜μ™€ κ°™λ‹€. 

    public void sort() {
        int temp = heapSize;
        for(int i=0; i<temp; i++) {
            System.out.print(delete() + " ");
        }
    }

 

νž™μ •λ ¬μ˜ μ‹œκ°„ λ³΅μž‘λ„ 

데이터 μ‚½μž… 

데이터λ₯Ό μ‚½μž…ν•˜λŠ” μž‘μ—…μ€ μ΅œμ•…μ˜ 경우 λͺ¨λ“  Level의 λ…Έλ“œμ— λŒ€ν•΄ 비ꡐ 연산을 진행해야 ν•˜λ―€λ‘œ O(lgn)이닀.  그런데 데이터 μ‚½μž… μž‘μ—…μ„ λͺ¨λ“  데이터에 λŒ€ν•΄ λ°˜λ³΅ν•˜λ―€λ‘œ O(n * lgn) 이라고 ν•  수 μžˆλ‹€. 

 

데이터 μ‚­μ œ 

데이터λ₯Ό μ‚­μ œν•˜λŠ” μž‘μ—…μ€ μ΅œμ•…, μ΅œμ„  λͺ¨λ‘ O(1)의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό 가지고 μžˆλ‹€.  데이터 μ‚­μ œ μž‘μ—… λ˜ν•œ λͺ¨λ“  데이터에 λŒ€ν•΄ λ°˜λ³΅ν•˜λ―€λ‘œ O(n * 1) μ΄μ§€λ§Œ, 데이터가 λ¬΄ν•œλŒ€λ‘œ 컀진닀면 O(n)은 O(n * lgn)에 λΉ„ν•΄ 큰 영ν–₯을 주지 λͺ»ν•˜λ―€λ‘œ μƒλž΅μ΄ κ°€λŠ₯ν•˜λ‹€.

 

λ”°λΌμ„œ νž™ μ •λ ¬μ˜ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(n * lgn)이닀.