对于给定的heapsort程序,出现以下错误提示。我是编程新手,因此为愚蠢的错误表示歉意。
错误:中止(3)(SIGABRT)中止信号
代码的主要部分如下
heapify-从给定数组中堆出一个程序
heapsort-用于根据堆对数组排序并将结果保存在数组中的函数
main-驱动程序功能
#include <iostream>
#include <math.h>
using namespace std;
void swapper (int first, int second) {
int temp;
temp = second;
second = first;
first = temp;
}
void heapify (int a[], int size) {
for(int i = 0; i < (size/2) ; i++) {
int left = 2*i;
int right = 2*i + 1;
if (a[i] < a[left]) {
swap(a[i], a[left]);
}
else if (a[i] < a[right]) {
swap(a[i],a[right]);
}
}
}
void heapsort(int a[], int size){
int treesize = size;
int i = size;
heapify(a,size);
while (treesize > 0) {
cout << " \t " << a[i];
swap(a[i],a[0]);
i --;
treesize--;
heapify(a, treesize);
}
cout <<"\n";
for(int i = 0; i < size; i++) {
cout <<"\t"<<a[i];
}
}
int main() {
// your code goes here
int a[] = {10,1,2,11,4,57,12,13,44,14,6,7,9,8,15,16,17,98};
int arrsize= sizeof(a)/(sizeof(a[0]));
int pos;
int ele = 7;
heapsort(a,arrsize);
for (int i = 0; i < arrsize; i++){
cout <<"\n "<<a[i];
cout<<"\n"<<arrsize;
}
return 0;
}
答案 0 :(得分:0)
我不确定程序其余部分的正确性,但是之所以会出现异常,是因为您访问内存超出范围。您以这样的数组大小调用heapsort
:
heapsort(a, arrsize);
然后将treesize
和i
设置为该大小:
int treesize = size;
int i = size;
然后在这些行中:
cout << " \t " << a[i];
swap(a[i], a[0]);
i
仍然等于arraysize
。但是最多只能是arraysize-1
。当您打印a[i]
时,这会导致未定义的行为,甚至更糟的是,下一行中的未定义行为会修改数组外部的值。在我的机器上,前者会打印垃圾值,而后者会导致堆栈损坏。相反,您应该像这样设置这些值:
int treesize = size-1;
int i = size-1;
这可以修复打印和异常情况。