堆的建立

博客主要围绕堆的建立展开,介绍了在信息技术领域中堆这种数据结构的构建相关内容。

堆的建立在这里插入图片描述

建立最大有多种方法和技巧,以下是一些常见且有效的方式: ### 利用算法原理 可以使用BUILD - MAX - HEAP算法,初始时,此算法能将数组A[1…n]建成最大,其中n为数组的长度。由于数组中的最大元素总在根结点A[1],通过将其与A[n]互换,该元素可放到正确位置。之后,若从中去掉结点n(通过减少A.heap - size的值实现),剩余结点中原来根的孩子结点仍为最大,但新的根节点可能违背最大性质,此时调用MAX - HEAPIFY (A, 1)来维护最大性质,不断重复此过程,直到的大小从n - 1下降到2。其伪代码如下: ```plaintext HEAPSORT(A) for i = A.length downto 2 exchange A[1] with A[i] A.heap - size -= 1 MAX - HEAPIFY (A, 1) ``` 这种方法基于排序的思想,从整体上构建最大,不断调整的结构以满足最大的性质要求[^1]。 ### 使用C++标准库函数 在C++中,可以使用`make_heap`函数来构建最大。例如: ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {3,5,7,4,9,1,4,5,8}; std::make_heap(vec.begin(), vec.end()); for (int num : vec) { std::cout << num << " "; } std::cout << std::endl; return 0; } ``` 默认情况下,`make_heap`函数使用`less`比较函数构造最大。通过这种方式,可以方便快捷地将一个容器中的元素构建成最大,无需手动实现复杂的构建逻辑[^2]。 ### 手动实现调整和构建函数 手动编写代码实现的调整和构建函数也是一种有效的技巧。以下是一个手动实现建立大根的C++代码示例: ```cpp #include <iostream> using namespace std; void swap(int *a, int *b) { int tmp = *a; *a = *b; *b = tmp; } void adjust_heap(int *Array, int index, int len) { int cur = index; int right_child = 2 * (cur + 1); while(right_child < len) { if(Array[right_child] < Array[right_child - 1]) { right_child--; } swap(Array[cur], Array[right_child]); cur = right_child; right_child = 2 * (cur + 1); } if(right_child == len) { if(Array[len - 1] > Array[right_child - 1]) { swap(Array[right_child - 1], Array[len - 1]); } } } void make_heap(int *Array, int len) { int index = (len - 2) / 2; do { adjust_heap(Array, index, len); index--; } while(index != -1); } int main() { const int len = 9; int array[len] = {1,2,3,4,5,6,7,8,9}; make_heap(array, len); for(int i = 0; i < len ; i++) { cout << array[i] << " "; } cout << endl; return 0; } ``` 该代码通过自定义`adjust_heap`函数来调整的结构,`make_heap`函数从数组的中间位置开始,逐步向上调整每个节点,最终构建出最大。手动实现可以更深入地理解最大的构建原理和过程[^3]。 ### 从中间节点开始调整 在手动构建最大时,从数组的中间位置(即`n / 2`,n为数组长度)开始,逐步向前调整每个节点。因为叶子节点本身就满足最大的性质,所以从中间节点开始调整可以减少不必要的操作。例如以下代码: ```cpp #include <iostream> using namespace std; void MakeHeap (int a[], int n) { int i, j, flag; for (i = n / 2; i >= 1; i--) { j = 2 * i; if (a[j] <= a[j + 1]) j++; if (a[i] < a[j]) { flag = a[i]; a[i] = a[j]; a[j] = flag; } } } int main () { int a[100]; int n, i; cout << "Enter the number:" << endl; cin >> n; for (i = 1; i <= n; i++) { cout << "Enter the element of the Heap:" << endl; cin >> a[i]; } MakeHeap (a, n); cout << "The Heap is:" << endl; for (i = 1; i <= n; i++) { cout << a[i] << " "; } cout << endl; return 1; } ``` 此代码从`n / 2`位置开始,将每个节点与其子节点进行比较和交换,确保每个子树都满足最大的性质,从而构建出整个最大[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值