自己实现的一个大顶堆

heap.h

#ifndef HEAP_H
#define HEAP_H 

#include <vector>

class Heap{
public:
    Heap(std::vector<int> &);//Constructor function
    void Insert(int );//Insert a value into heap
    void Delete(int );//Delete a value from heap,if can't find the value in heap,do nothing
    int Max();//Return the maximum value if heap
    void Ext_Max();//Delete the maximum value in heap
    std::vector<int> Heap_Sort();//Return the sorted value of heap,BUT the value in heap didn't change
private:
    void Max_Heapify(int );//Fix the heap from top to bottom form a position
    int Find(int,int);//Find the value from a position,return the position ,if can't find return -1
    std::vector<int > data;
    int len=0;

};
#endif
heap.cpp

#include "heap.h"

Heap::Heap(std::vector<int> &dat){
    data=dat;
    len=data.size();
    for(int i=len/2-1;i>=0;--i){
        Max_Heapify(i);
    }
}

void Heap::Max_Heapify(int i){
    int largest=0;
    if((2*i+1<len)&&data[i]<data[2*i+1]){
        largest=2*i+1;
    }
    else largest=i;
    if((2*i+2<len)&&data[largest]<data[2*i+2]){
        largest=2*i+2;
    }
    if(largest!=i){
        int tmp=data[i];
        data[i]=data[largest];
        data[largest]=tmp;
        Max_Heapify(largest);
    }

}

std::vector<int> Heap::Heap_Sort(){
    std::vector<int >res;
    auto tmp_data = data;
    if(len==0)return res;
    int tmp_len=len;

    int tmp=data[0];
    data[0]=data[len-1];
    data[len-1]=tmp;
    len--;
    while(len>0){
        Max_Heapify(0);
        int tmp=data[0];
        data[0]=data[len-1];
        data[len-1]=tmp;
        len--;
    }
    len=tmp_len;
    res=data;
    data = tmp_data;
    return res;
}

int Heap::Max(){
    return data[0];
}

void Heap::Insert(int a){
    data.push_back(a);
    len++;
    for(int i=len/2-1;i>=0;--i){
        Max_Heapify(i);
    }
}


int Heap::Find(int a,int i){
    if(data[i]==a){
        return i;
    }
    else if(a>data[i])return -1;
    else {
        int left=-1;
        int right=-1;
        if(2*i+1<len){
            int left=Find(a,2*i+1);
        }
        if(2*i+2<len){
            int right=Find(a,2*i+2);
        }
        if(left!=-1){
            return left;
        }
        if(right!=-1){
            return right;
        }
    }

}
void Heap::Delete(int a){
    int i=Find(a,0);
    if(i==-1){
        return;
    }
    else{
        data.erase(data.begin()+i);
        len--;
        for(int i=len/2-1;i>=0;--i){
            Max_Heapify(i);
        }
        return;
    }
}

void Heap::Ext_Max(){
    if(len==0){
        return;
    }
    else{
        data.erase(data.begin());
        len--;
        for(int i=len/2-1;i>=0;--i){
            Max_Heapify(i);
        }
        return;
    }
}
main.cpp

#include "heap.h"
#include <iostream>
using namespace std;

int main(){
    vector<int>vec = { 3, 1, 5, 7, 6, 8, 10, 33, 4 };
    Heap hp(vec);
    auto res=hp.Heap_Sort();
    hp.Insert(2);
    int max = hp.Max();
    hp.Delete(5);
    hp.Ext_Max();
    return 0;
}
### C语言实现大顶堆 在C语言中,可以通过手动构建堆的方式来实现大顶堆。以下是基于一维数组存储的完整代码示例以及相关说明。 #### 大顶堆的核心概念 大顶堆是一种完全二叉树结构,在该结构中父节点的值总是大于等于其子节点的值[^1]。为了保持这种性质,通常需要执行两个主要操作:入堆(insert)和出堆(deleteMax),并辅以向下调整(sift down)或向上调整(sift up)逻辑。 --- #### 示例代码:大顶堆实现 以下是一个完整的C语言程序,用于创建、插入数据到大顶堆,并从中删除最大值: ```c #include <stdio.h> #include <stdlib.h> // 定义堆的最大容量 #define MAX_HEAP_SIZE 100 typedef struct { int *data; int size; } MaxHeap; // 初始化堆 void initHeap(MaxHeap *heap) { heap->data = (int *)malloc(MAX_HEAP_SIZE * sizeof(int)); heap->size = 0; } // 向下调整算法 void siftDown(MaxHeap *heap, int index) { int largest = index; int leftChild = 2 * index + 1; int rightChild = 2 * index + 2; if (leftChild < heap->size && heap->data[leftChild] > heap->data[largest]) { largest = leftChild; } if (rightChild < heap->size && heap->data[rightChild] > heap->data[largest]) { largest = rightChild; } if (largest != index) { // 交换当前节点与其较大的孩子节点 int temp = heap->data[index]; heap->data[index] = heap->data[largest]; heap->data[largest] = temp; // 继续向下调整 siftDown(heap, largest); } } // 插入新元素到堆中 void insertToHeap(MaxHeap *heap, int value) { if (heap->size >= MAX_HEAP_SIZE) { printf("Heap is full!\n"); return; } // 将新元素放在最后的位置 heap->data[heap->size++] = value; // 调整位置使其满足大顶堆特性 int currentIndex = heap->size - 1; while (currentIndex > 0) { int parentIndex = (currentIndex - 1) / 2; if (heap->data[currentIndex] <= heap->data[parentIndex]) break; // 如果当前节点比父节点更大,则交换它们 int temp = heap->data[currentIndex]; heap->data[currentIndex] = heap->data[parentIndex]; heap->data[parentIndex] = temp; currentIndex = parentIndex; } } // 删除堆顶元素(即最大的元素) int deleteFromHeap(MaxHeap *heap) { if (heap->size == 0) { printf("Heap is empty!\n"); return -1; // 返回错误标志 } // 获取堆顶元素 int maxValue = heap->data[0]; // 将最后一个元素移到堆顶 heap->data[0] = heap->data[--heap->size]; // 下调调整使堆恢复有序 siftDown(heap, 0); return maxValue; } // 打印堆的内容 void printHeap(MaxHeap *heap) { for (int i = 0; i < heap->size; ++i) { printf("%d ", heap->data[i]); } printf("\n"); } // 测试函数 int main() { MaxHeap myHeap; initHeap(&myHeap); // 插入一些测试数据 int values[] = {3, 7, 9, 5, 8}; for (int i = 0; i < 5; ++i) { insertToHeap(&myHeap, values[i]); } printf("After inserting elements:\n"); printHeap(&myHeap); // 删除堆顶元素 printf("Deleted max element: %d\n", deleteFromHeap(&myHeap)); printf("After deleting the top element:\n"); printHeap(&myHeap); free(myHeap.data); // 清理内存 return 0; } ``` --- #### 关键点解析 1. **初始化堆** 使用`initHeap()`函数分配动态内存给堆的数据区域,并设置初始大小为零。 2. **插入操作** 新元素被放置在堆的最后一层最右侧位置,随后通过比较它与父节点的关系决定是否需要上调调整(swap with parent until valid property restored). 3. **删除操作** 堆顶元素(最大值)被移除后,将最后一层最右端的叶子节点移动至根部替代原位;接着采用`siftDown()`方法重新整理整个堆结构直至再次符合定义条件[^2]. 4. **打印功能** 提供了一个简单的辅助工具用以展示当前状态下所有成员排列情况以便验证结果正确与否. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值