我最终尝试使用堆排序按字母顺序对已读入的单词进行排序。我之前从未做过堆操作,所以我尝试着跟着我的书一起学习。我正在使用cin将单词存储到动态分配的数组中,因为提前知道单词的数量。从单独的代码中,我知道它正在被读取,并且数组正在正确地变大。然后,我试图对这个数组进行堆扩,但是由于我是编程新手,所以不断遇到分段错误,无法确定如何追溯到我做错了什么。这是我的heapify代码:

void Heap::make(){
    //make a heap from wordArray
    //r = last non-leaf
    for(int r = size/2; r > 1; r--){
        int c = 2 * r; //location of left child
        while(r <= size){ //size is a data member of Heap
//if r has 2 children and right is larger, make c the right child
            if((c < size) && (wordArray[c] < wordArray[c+1])){
                c++;
            }
//fix if parent failed heap-order condition
            if(wordArray[r] < wordArray[c]){

                swap(wordArray[r], wordArray[c]);
                r = c;    //check that it didn't get messed up at c
                c = 2 * c;
            }
            else{
                break; //heap-order condition holds so stop
            }
        }
    }
}

通过玩cout,我可以确定该程序在if(wordArray[r] < wordArray[c])部分之前一直有效。 wordArray的元素是字符串,比较器通过外部测试即可正常工作。这与动态数组有关吗?我对我在这里做错了感到困惑。

最佳答案

您正在超越界限。当您检查时:

if((c < size)
c是最后一个元素,您在这里越界阅读:
 if((c < size) && (wordArray[c] < wordArray[c+1])){
                                             ^

检查应为:
if((c+1 < size)

还有另一个问题在这里:
while(r <= size)

如果r明显超出范围,则在代码中使用r == size

对于大小为n的数组,其元素来自0 to n-1,因此访问n th元素是未定义的行为。

10-06 11:50