我最终试图使用heapsort按字母顺序对已经读过的单词进行排序。我之前从未做过堆,所以我试图跟随我的书。我使用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
}
}
}
}
通过玩couts,我可以确定该程序在if(wordArray[r] < wordArray[c])
部分之前有效。 wordArray的元素是蜇,并且比较器在外部测试中正常工作。这与数组是动态的有关吗?我很困惑我在这里做错了什么。
答案 0 :(得分:2)
你正在读书。当你检查:
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
,因此访问{{1}} 元素是未定义的行为。
答案 1 :(得分:1)
你可以通过它的n-1行arr[n-1];//this is the nth element
您的代码中出现了分段错误
(wordArray[c] < wordArray[c+1]) // try to modify this.
让我们假设size = 6
Whwn for()
循环将首次运行,c = 2 * 6表示6,而您访问arr[6] and arr[6+1]
两者都无效。数组索引从零而不是一开始。