插入法建立一个最大堆

//用插入的方法建堆
#include <iostream>
#define PARENT(i) i>>1
using namespace std;

void MAX_HEAP_INSERT(int A[],int next)
{
    while(1)
    {
        int par=PARENT(next);
        if(next>1 && A[par]<A[next])
        {
            int temp=A[par];
            A[par]=A[next];
            A[next]=temp;
            next=par;
        }
        else break;
    }
}

void BUILD_MAX_HEAP(int A[],int heap_size)
{
    if(heap_size<2)
    {
        if(heap_size==1) return;
        else cout<<"heapsize wrong"<<endl;
    }
    for(int i=2;i<heap_size+1;i++)
    {
        MAX_HEAP_INSERT(A,i);
    }
}

int main(int argc, char *argv[])
{
    int n;
    cin>>n;
    int test[n+1];
    for(int i=1;i<n+1;i++) cin>>test[i];

    BUILD_MAX_HEAP(test,n);

    for(int i=1;i<n+1;i++) cout<<test[i]<<" ";
    cout<<endl;
    cout << "Hello World!" << endl;
    return 0;
}
### 使用筛选法构建堆的数据结构 #### 堆的概念与性质 堆是一种特殊的完全二叉树,满足父节点的关键字值大于等于(或小于等于)子节点关键字值的条件。对于最大堆而言,根节点始终存储的是整个堆的最大值;而对于最小堆,则相反[^1]。 #### 筛选法建堆原理 筛选法的核心思想是从某个非叶子节点出发,将其与其孩子节点进行比较并交换位置,直到满足堆的性质为止。这一过程可以分为两种情况: - **自下而上的调整**:适用于单个元素插入后的堆重建操作。 - **自上而下的调整**:用于初始建堆阶段,从最后一个非叶节点开始逐级向下调整至根节点[^2]。 #### Python 实现最大堆的构建 以下是基于筛选法实现最大堆的具体代码: ```python def heapify(arr, n, i): # 自顶向下的调整函数 largest = i # 初始化当前节点为最大的索引 left = 2 * i + 1 # 左孩子的索引 right = 2 * i + 2 # 右孩子的索引 # 如果左孩子存在且大于当前节点,则更新largest if left < n and arr[left] > arr[largest]: largest = left # 如果右孩子存在且大于当前节点,则再次更新largest if right < n and arr[right] > arr[largest]: largest = right # 若最大值不是当前节点,则交换它们的位置,并继续递归调整被影响的部分 if largest != i: arr[i], arr[largest] = arr[largest], arr[i] heapify(arr, n, largest) def build_max_heap(arr): # 构造最大堆的主要逻辑 n = len(arr) # 从最后一个非叶子节点开始向前遍历 for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) # 调整以i为根的子树使其成为合法的堆 # 测试用例 array = [20, 12, 35, 15, 10, 80, 30, 17, 2, 1] build_max_heap(array) print("构建完成后的大顶堆:", array) ``` 上述代码实现了利用筛选法创建大顶堆的过程。`heapify()` 函数负责局部范围内的结构调整,而 `build_max_heap()` 则完成了全局范围内所有必要部分的调用。 #### 数组映射关系 假设有一个数组表示一棵完整的二叉树,那么可以通过简单的计算找到任意节点的孩子或者父亲节点: - 对于第 \(i\) 个节点, - 它的父亲节点位于 \((i-1)/2\)(取整数部分), - 它的两个孩子分别处于\(2*i+1\) 和 \(2*i+2\) 的位置 (如果这些索引有效)[^3]。 #### 时间复杂度分析 采用筛选法建立大小为n的堆所需时间主要取决于每层执行下沉操作的数量以及层数本身的高度h=log₂n。因此整体性能接近O(n),这比逐一插入形成堆要高效得多[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值