给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
Given an array of integers, needing run operations on a Max_Heap. Getting error "segmentation fault", Any ideas? (C++)
这是我在这里的第一篇文章,所以请耐心等待。 我正在做一项任务,并查看了各种来源来创建和解决这个问题。
提示问题 我已经编写了max_heapify、打印、build_heap和delete_root函数,但我唯一得到的输出是退出,分段错误我通过同一个编译器运行了类似的代码,没有任何问题。
我意识到我的代码没有完全缩进,但如果有人对如何进行此运行有任何建议,将不胜感激。
#include <iostream>
#include <bits/stdc++.h>
#include <math.h>
using namespace std;
void max_heapify(int arr[], int n, int i){
int max_val = i;
int left = 2*i +1;
int right = 2*i +2;
// if left child is larger than root
// set root equal to left child
if ( left < n && arr[left] > arr[max_val] )
max_val = left;
// if right child is larger than largest
if (right < n && arr[right] > max_val)
max_val = right;
// if largest is not root
if (max_val != i)
{
//swap values
int temp = arr[i];
arr[i] = arr[max_val];
arr[max_val] = temp;
max_heapify(arr,n,i);
}
}
void buildh(int arr[],int n)
{
//index of last non leaf node
int indx = (n/2) -1;
for (int i = indx; i >= 0; i--)
{
max_heapify(arr,n,i);
}
}
void printh(int arr[], int n)
{
cout << "Heap is:n";
for (int i = 0; i < n; ++i)
cout << arr[i] << " ";
cout << "n";
}
void delete_root(int arr[], int n)
{
int last = arr[n-1];
arr[0] = last;
n = n-1;
max_heapify(arr,n,0);
}
int main() {
int arr[] = {28,12,17,5,7,22,13,12,4,11,16}; // create an array of values
int n = sizeof(arr) / sizeof(arr[0]);
buildh(arr,n);
printh(arr,n);
delete_root(arr,n);
return 0;
}
由于max_heapify()
继续递归调用自己而未达到终止条件而发生的段错误。
代码中的两个问题:
问题1:
在max_heapify()
,在这个声明中
if (right < n && arr[right] > max_val)
应该是arr[max_val]
.正确的陈述将是
if (right < n && arr[right] > arr[max_val])
问题2:
在每次调用max_heapify()
时,您都在i
位置堆积元素
max_heapify(arr,n,i);
^^
相反,您应该在索引max_val
识别出left
和right
子级之间的最大值并交换a[i]
值和a[max_val]
值后传递索引
max_heapify(arr,n,max_val);
这样,递归调用将在max_val
位置堆积数组元素。
我认为问题发生在这个函数中:
void max_heapify(int arr[], int n, int i){
int max_val = i;
int left = 2*i +1;
int right = 2*i +2;
// if left child is larger than root, set root equal to left child
if ( left < n && arr[left] > arr[max_val] )
max_val = left;
// if right child is larger than largest
if (right < n && arr[right] > max_val)
max_val = right;
// if largest is not root
if (max_val != i){
//swap values
int temp = arr[i];
arr[i] = arr[max_val];
arr[max_val] = temp;
max_heapify(arr,n,i);
}
}
最后,你称max_heapify()
在它本身。此代码的问题在于递归没有终止条件;换句话说,没有什么可以阻止它递归到无穷大。正如@Retired Ninja评论的那样,此过程可能是导致Segmentation Fault
的原因,因为它超过了允许的最大递归深度。
要解决此问题,您需要考虑减少max_heapify()
递归深度的方法(您真的需要递归调用它吗?
相关文章:
- 示例外壳应用程序显示的 V8 "segmentation fault (core dumped)"错误
- 给定一个整数数组,需要在Max_Heap上运行操作。得到错误"segmentation fault",有什么想法吗?(C++)
- 导致Segmentation错误的结构中的矢量
- OpenGL "Segmentation fault"错误
- 如何修复访问动态数组中结构中的字符串变量时"segmentation fault (core dumped)"错误
- 如何修复 C++ 中的'Segmentation fault'错误
- 尝试读取包含 ints 并存储在 int vector 中的文件,但我不断收到错误"Segmentation fault (core dumped)"
- 为什么当我更改此代码时会给我"segmentation fault"错误?
- 尝试将文本文件加载到动态分配的 2D 数组中时出现'Segmentation fault'错误
- 由于while循环中的条件,导致Segmentation错误
- 取消引用会导致Segmentation错误
- 调用构造函数定义中的函数后收到Segmentation Fault 11错误
- 为什么我在运行程序时收到错误"segmentation fault"?
- 当我尝试从结构列表中访问内存时出现错误:" Program received signal SIGSEGV, Segmentation fault."
- 当g++静态链接pthread时,导致Segmentation错误,原因何在
- 为什么我的程序在运行后给出"segmentation fault"(核心转储)错误
- 在Qt错误显示:"Fault Module Name: Qt5Cored.dll"在win 7和调试时:"segmentation fault"在CentOS Linux和Win 7中
- 引用字符串参数导致Segmentation错误
- 为什么 g++ 在将节点指向数据字符时返回'Segmentation fault'错误?
- "Segmentation fault"与"run time"错误?