Получение ошибки сегментации со строкой кода сортировки кучи в C ++ - PullRequest
0 голосов
/ 27 ноября 2011
int heapSize = 20; //variable 
int left(int i) {
return (2 * i) + 1;
}

int right(int i) {
return (2 * i) + 2;
}

void heapify(string arr[], int i) {
int l = left(i);
int great=0;
int r = right(i);
if ( ((strcmp(arr[l].c_str(),arr[i].c_str()))>0) && (l < heapSize)) {
great = l;
}
else {
great = i;
}

if ( ((strcmp(arr[r].c_str(),arr[great].c_str()))>0) && (r < heapSize)) {
great = r;
}
if (great != i) {
string temp = arr[i];
arr[i] = arr[great];
arr[great] = temp;
heapify(arr, great); //Getting segment here 
}

}

void BuildMaxHeap(string arr[]) {
for (int i = (heapSize - 1) / 2; i >= 0; i--) {
heapify(arr, i);
}
}

void HeapSort(string arr[]) {
BuildMaxHeap(arr); //
for (int i = heapSize; i > 0; i--) {
string temp = arr[0];
arr[0] = arr[heapSize - 1];
arr[heapSize - 1] = temp;
heapSize = heapSize - 1;
heapify(arr, 0);
}

}

Получение ошибки сегментации с помощью этого кода сортировки кучи строк для размера heapSize больше 15, например, 20 элементов. Любая идея о причине?

Я отследил его в GDB и получил это

#0  0x0038124b in ?? () from /lib/tls/i686/cmov/libc.so.6
#1  0x08048f62 in heapify(std::string*, int) ()
#2  0x08049050 in heapify(std::string*, int) ()
#3  0x080490ae in BuildMaxHeap(std::string*) ()
#4  0x080490d3 in HeapSort(std::string*) ()
#5  0x080494f5 in main ()

Итак, что не так с функцией heapify?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2011

Это ваши индексы массива.Проверьте функции left & right и параметры цикла for, которые их передают.С нечетным значением 'heapSize' left в конечном итоге вернет индекс за концом массива.С четным размером heapSize, right сделает это.

Например, когда «heapSize» == 15, то максимальное значение «i», переданное в «heapify», будет 7 ((15-1) / 2) .Передав это в 'left', и вы получите 15. Слишком большой для массива, поэтому он гадит, пытаясь получить строку для 'strcmp'.

Возможно, я сделал что-то не так, но яне работает ваш код независимо от размера кучи.

PS.построить с флагом '-g3', чтобы получить лучшие символы отладки в GDB.g++ -g3 heap.cc

0 голосов
/ 27 ноября 2011

В if s вы должны проверить, находятся ли индексы в границах массива , прежде чем вы попытаетесь сравнить строки:

if ( (l < heapSize) && (arr[l] > arr[great]) ) {
...