C++构建堆

class Heap{
public:
    Heap(int);
    ~Heap();
    void maxHeap(int x);
    int leftChild(int x);
    int rightChild(int x);
    int parent(int x);
    void init(int *);
    void constructHeap();
    void print();
    void insertHeap(int );
private:
    int *heap;
    int m_size;
};

Heap::Heap(int size):m_size(size){
    heap = (int*) malloc(sizeof(int) * m_size);
}

Heap::~Heap(){
    free(heap);
}

int Heap::leftChild(int x){
    return 2 * x +1;
}

int Heap::rightChild(int x){
    return 2 * x + 2;
}

int Heap::parent(int x){
    return (x-1)/2;
}

void Heap::maxHeap(int x){
    int max = 0;
    if(leftChild(x) < m_size){
        max = leftChild(x);
        if( (rightChild(x) < m_size) && (heap[max] < heap[rightChild(x)])){
            max = rightChild(x);
        }
        if(heap[max] > heap[x]){
            swap(heap[x] , heap[max]);
        }
        maxHeap(max);
    }else{
        return;
    }

}

void Heap::init(int* x){
    for(int i = 0 ; i < m_size ;++i){
        heap[i] = x[i];
    }
}

void Heap::constructHeap(){
    for(int i = (m_size - 1)/2 ; i >= 0 ;--i ){
        maxHeap(i);
    }
}

void Heap::print(){
    for(int i = 0 ; i < m_size ; ++i){
        cout<<heap[i]<<" ";
    }
    cout<<endl;
}

void Heap::insertHeap(int d){
    if(heap[0] > d){
        heap[0] = d;
        maxHeap(0);
    }
}

struct Node{
    int data;
    struct Node* next;
    Node(int k){
        data = k;
        next = NULL;
    }
};

链表:

class LinkList{
public:
    void insert(int d);
    void print();
    LinkList();
    void reverse();
private:
    Node* head;
};

void LinkList::insert(int d){
    if(head == NULL){
        head = new Node(d);
    }else{
        Node* p = head;
        while(p->next != NULL){
            p = p->next;
        }
        p->next = new Node(d);
    }
}

void LinkList::print(){
    Node* p = head;
    while(p != NULL){
        cout<<p->data<<endl;
        p = p->next;
    }
}

LinkList::LinkList(){
    head = NULL;
}

void LinkList::reverse(){
    Node* p = head;
    Node* q = head->next;
    Node* r = head->next->next;
    p->next = NULL;
    while(r != NULL){
        q->next = p;
        p = q;
        q = r;
        r = r->next;
    }
    q->next = p;
    head = q;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值