Ошибка Сегментации Сортировки Radix

Итак, у меня есть программа, предназначенная для проверки времени выполнения сортировки по основанию. При тестировании на моем компьютере с Windows все работает отлично, но когда я переношу его на школьные компьютеры с Linux (где он должен работать), я получаю загадочную ошибку сегментации. Алгоритм радикальной сортировки адаптирован для обработки векторов из найденного здесь: http://en.wikipedia.org/wiki/Radix_sort#Example_in_C.2B.2B

Я предполагаю, что моя проблема связана с тем, как я обращаюсь с векторами, поскольку я все еще новичок в них. Я попытался запустить его через GDB, и я не уверен, что я смотрю здесь.

Program received signal SIGSEGV, Segmentation fault.
0x0804983e in std::vector<int, std::allocator<int> >::operator[] (
this=0xfffeebd0, __n=18) at /usr/include/c++/4.6/bits/stl_vector.h:696
696           { return *(this->_M_impl._M_start + __n); }
(gdb) bt
#0  0x0804983e in std::vector<int, std::allocator<int> >::operator[] (
this=0xfffeebd0, __n=18) at /usr/include/c++/4.6/bits/stl_vector.h:696
#1  0x08049202 in radix (nums=..., length=135041, largest=0)
at RadixSort2.cpp:98
Backtrace stopped: previous frame inner to this frame (corrupt stack?)

Я включил пару тестовых операторов печати в основную функцию. Каждый раз печатается строка «TEST ME 1», но строка «test me 2» менее последовательна. Иногда он вообще не печатается, а иногда — несколько раз. Я думаю, что самое большее, что я видел, это напечатано восемь раз. Это еще больше сбивает меня с толку, поскольку единственное, что происходит между первым оператором test и вторым, — это начало цикла for, но пока ничего не должно выполняться, так почему в некоторых случаях он вообще не запускается? Функция radix будет опубликована ниже, а полный код можно найти здесь: https://gist.github.com/Shoggoth269/7f6645d01eaf5ba91617

void radix(vector<int> & nums, int length, int largest)
{
list<int> bucket[10];
int i;

for(int n = 1; largest >= n; n *= 10)
{
cout << endl << "TEST ME 1" << endl;
for(i = 0; i < length; i++)
{
cout << endl << "test me 2";
bucket[(nums[i]/n)%10].push_back(nums[i]);
}

for (int k = i = 0; i < 10; bucket[i++].clear())
for(list<int>::iterator j = bucket[i].begin(); j!=bucket[i].end(); nums[k++] = *    (j++));
}
}

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]