Я собираюсь использовать этот специальный алгоритм быстрой сортировки, и я не знаю, где проблема. Я нашел пример на форуме, который очень хорошо объясняет, что я пытаюсь сделать.Индексированный массив quicksort debug
Учитывая индекс массив смежных, упорядоченных чисел (представляющих элементы в массиве данных), вы все равно должны сравнить значение данных; вы просто доступ к ним через индекс. Вы меняете значения индекса, но не значения данных .
Unsorted data: 09 04 47 05 03 12
Index array: 00 01 02 03 04 05
After sort,
Unsorted data: 09 04 47 05 03 12
Index array: 04 01 03 00 05 02
Print the values indexed by the index array,
from beginning to end of the array:
Index array [0] value [04] data array [04] = 03
[1] 01 [01] 04
[2] 03 [03] 05
[3] 00 [00] 09
[4] 05 [05] 12
[5] 02 [02] 47
Output is the data, ordered at the output
Я только добавить одну вещь. Компаратор является нормальным компаратором, за исключением того, что если мы сравниваем два разных символа с одинаковыми значениями, мы сравниваем следующий символ каждого и возвращаем этот результат. То есть, сравнивая вращения.
int compare(unsigned char i, unsigned char j);
Я не буду публиковать определение, потому что я уверен, что он работает идеально. Ошибка заключается в определении быстрой сортировки.
void quicksort(unsigned char* a, unsigned char left, unsigned char right) {
unsigned char i = left;
unsigned char j = right;
unsigned char half = (left + right)/2;
while (i <= j) {
while ((compare(a[i], a[half]) == -1) && (i < right))
i++;
while ((compare(a[j], a[half]) == 1) && (j > left))
j--;
if (i <= j) {
unsigned char aux = a[i];
a[i] = a[j];
a[j] = aux;
i++; //THERE
j--; //THERE
}
}
if (left < j)
quicksort(a, left, j);
if (i < right)
quicksort(a, i, right);
}
Иногда я = 255 и у = 0, и я не знаю почему, программа получает там, и их значения идут переполнения. Я искал ошибки тысячу раз, и я не могу найти, где ошибка.
Примечания: 1) Я отлично осведомлен о диапазонах символов без знака C++, и я не могу изменить их на int. 2) Я фактически не включаю объявление фактического массива данных. Функция сравнения имеет доступ к ней, поскольку она является атрибутом ее класса.
Я прекрасно это понимаю, я включу это в вопрос – Erandros
Байт - это _not_ 8 бит в C, это размер, необходимый для хранения символа - это может быть почти любой размер выше 8 бит (и, возможно, меньше, хотя я не мог потрудиться, чтобы посмотреть стандарт на данный момент). Это не стоит нисходящего, поскольку ваша терминология неверна, а не ваш фактический ответ, но вы можете подумать об этом. – paxdiablo
@ Erandros, вы говорите, что никогда не сортируете массив длиной более 254 предметов? Кажется излишне ограничительным. –