2015년 10월 20일 화요일

Heap, Heap sort

Heap
 - upheap (insert)
 - downheap (delete)
 - heap_sort


cpp to html [-] Collapse
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int MINF = (1 << 31);
const int MAX_SIZE = 1000;
class Heap{
private:
    int node[MAX_SIZE];
    int cnt;
public:
    Heap(){
        cnt = 0;
        for (int i = 0; i < MAX_SIZE; i++)
            node[i] = MINF;
    }

    bool insert_hp(int v){ //upheap
        if (cnt >= 1000) return false;
        cnt++;
        node[cnt] = v;
        int here = cnt;
        int parent = cnt / 2;
        while (parent > 0){
            if (node[parent] >= node[here])
                break;
            else{
                swap(node[parent], node[here]);
                here = parent;
                parent = here / 2;
            }
        }
        return true;
    }
    int delete_hp(){//downheap
        if (cnt == 0) return MINF;
        else{
            int re_val = node[1];
            node[1] = node[cnt];
            node[cnt] = MINF;
            cnt--;
            int here = 1;
            while (1){
                int max_idx;
                if (node[here * 2] > node[here * 2 + 1])
                    max_idx = here * 2;
                else
                    max_idx = here * 2 + 1;
                if (node[here] >= node[max_idx])
                    break;
                else{
                    swap(node[here], node[max_idx]);
                    here = max_idx;
                }
            }
            return re_val;
        }
    }
    bool sort_hp(){
        if (cnt == 0) return false;
        int temp = cnt;
        int sort_res[MAX_SIZE];
        for (int j = temp; j >= 0; j--){
            sort_res[j] = delete_hp();;
        }
        cnt = temp;

        for (int i = 1; i <= temp; i++){
            printf("%d ", sort_res[i]);
        }
        puts("");
    }
    void print_hp(){
        for (int i = 1; i <= cnt; i++){
            printf("%d ", node[i]);
        }
        puts("");
    }
};

int main(){
    freopen("input.txt", "r", stdin);
    Heap mh;
    int n; scanf("%d", &n);
    for (int i = 0; i < n; i++){
        int v; scanf("%d", &v);
        mh.insert_hp(v);
    }
    mh.print_hp();
    mh.sort_hp();
}

댓글 없음:

댓글 쓰기