рандомизированная быстрая сортировка [вылетает на некоторых входах] - PullRequest
1 голос
/ 13 декабря 2010

Я удалил коды, потому что это домашнее задание.Если вам действительно нужна помощь, вы можете посмотреть обсуждение, которое я провел с Джорджем Б. (ниже), или написать мне в личку.


Привет, ребята.Это домашнее задание.Я протестировал его на других алгоритмах сортировки, и QS - единственный, который падает на некоторых случайных входах.

Программа закрыта долго (с другими вещами), но ввод генерируется случайным образом ....

Я потратил несколько часов на трассировку кодов и все еще не мог выяснить какую-либо ошибку .... QS, вероятно, очень прост для профессионалов, поэтому я надеюсь получить советы по этой реализации ....

Любой вклад приветствуется!


В: Что такое "случайный"?

A: Включена часть генерации.

void randomArray(unsigned long*& A, unsigned long size)
{
 //Note that RAND_MAX is a little small for some compilers (2^16-1).
 //In order to test our algorithms on large arrays without huge
 //numbers of duplicates, we'll set the high-order and low-order
 //parts of the return value with two random values.
 A = new unsigned long[size];
 for(unsigned long i=0; i<size; i++)
  A[i] = (rand()<<16) | (rand());

 //Another note:  initially, if you want to test your program out with smaller
 //arrays and small numbers, just reduce A[i] mod k for some small value k as in the following:
 //A[i] = rand() % 16;
 //this may help you debug at first.
}

В: Что за ошибка?

Ну, я не получаю ошибку компиляции.Без QS я могу без проблем запустить другие четыре алгоритма сортировки (я могу постоянно выполнять сортировку).Когда QS активирован, после запуска программы один или два или три раза, или даже при первом запуске, программа завершается (я использую Eclipse, поэтому консоли заканчиваются).

введите количество элементов или отрицательное число для выхода: 5 {несколько массивов}

выбор сортировки занял 0 секунд.сортировка слиянием заняла 0 секунд.быстрая сортировка заняла 0 секунд.сортировка кучи заняла 0 секунд.сортировка ведра заняла 0 секунд.{вывод 5 отсортированных массивов}

введите количество элементов или отрицательное число для выхода: 6 {некоторые массивы}

выбор сортировки занял 0 секунд.сортировка слиянием заняла 0 секунд.быстрая сортировка заняла 0 секунд.сортировка кучи заняла 0 секунд.сортировка сегмента заняла 0 секунд.

{вывод 5 отсортированных массивов}

введите количество элементов или отрицательное число для выхода: 8 {массивы} --- консоль заканчивается ---

Опять же, проблема в том, что он довольно часто дает сбой, поэтому можно предположить, что существует высокая вероятность нарушения прав доступа ,, но при выполнении более 10 трассировок я не вижу проблемы .... (возможно, я перегружал свой мозговой стек - _ -)

Спасибо.

Ответы [ 2 ]

1 голос
/ 13 декабря 2010

Подсказка:

q is unsigned (the result of the partition function)
so, q-1 is also unsigned
what if q is zero?

(Это домашнее задание, так что вы должны понять это, я думаю :))

0 голосов
/ 13 декабря 2010

Трассировка вашего алгоритма с массивом {2,5,2}.Очевидно, что ваша программа падает, как только в вашем списке появляются повторяющиеся номера.Первый вызов Partition вернет 2 в качестве индекса r.Таким образом, второй вызов quickSort(A,3,2) будет обращаться к ячейкам памяти, не входящим в границы массива.Всегда полезно выполнять проверку границ для массивов вручную и генерировать понятный вывод, чтобы легче отслеживать и отлаживать вашу программу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...