在堆排序程序中获取sigabrt错误

时间:2019-03-05 13:01:06

标签: c++ sigabrt heapsort

对于给定的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;
}

1 个答案:

答案 0 :(得分: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;

这可以修复打印和异常情况。