在heapsort程序中获取sigabrt错误

问题描述 投票:2回答:1

对于给定的heapsort程序,我得到sigabrt错误,如下所示。我是编程新手,所以我为愚蠢的错误道歉。

错误:中止信号(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;
}
c++ sigabrt heapsort
1个回答
0
投票

我不确定程序其余部分的正确性,但是你得到异常的原因是因为你正在访问内存超出范围。你用这样的数组大小调用heapsort

heapsort(a, arrsize);

然后你将treesizei设置为那个大小:

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;

这修复了打印和异常。

© www.soinside.com 2019 - 2024. All rights reserved.