2011-06-22 2 views
0

Я собираюсь использовать этот специальный алгоритм быстрой сортировки, и я не знаю, где проблема. Я нашел пример на форуме, который очень хорошо объясняет, что я пытаюсь сделать.Индексированный массив 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) Я фактически не включаю объявление фактического массива данных. Функция сравнения имеет доступ к ней, поскольку она является атрибутом ее класса.

ответ

1

Uhh вы не можете хранить числа, превышающие 255 или ниже 0, в знаке без знака. Беззнаковый символ может хранить диапазон, определенный одним беззнаковым байтом, поэтому 8 двоичных цифр. 2^8 = 256, и поскольку мы включаем 0, имеем 256 - 1, давая нам 255. (или в шестнадцатеричном виде, 0xFF)

Попробуйте использовать ints или даже шорты. (ключевое слово short)

+0

Я прекрасно это понимаю, я включу это в вопрос – Erandros

+0

Байт - это _not_ 8 бит в C, это размер, необходимый для хранения символа - это может быть почти любой размер выше 8 бит (и, возможно, меньше, хотя я не мог потрудиться, чтобы посмотреть стандарт на данный момент). Это не стоит нисходящего, поскольку ваша терминология неверна, а не ваш фактический ответ, но вы можете подумать об этом. – paxdiablo

+1

@ Erandros, вы говорите, что никогда не сортируете массив длиной более 254 предметов? Кажется излишне ограничительным. –

Смежные вопросы