2015-05-24 4 views
-1

быстрой сортировки я попытался реализовать быструю сортировку по массивам int64_t так:Нескончаемый

void quicksort (int64_t *array,size_t size) { 
    int64_t *split; 
    size_t i=0; 
    size_t j=size-1; 
    if (size>1) { 
    split=({ 
     int64_t p=array[0]; 
     do { 
      for (;array[i]<p;i++); 
      for (;array[j]>p;j--); 
      swap(array[i],array[j]); 
     } while (i<j); 
     swap(array[i],array[j]); 
     swap(array[j],array[size]); 
     &(array[j]); 
     })-1; 
    quicksort(array,j-1); 
    quicksort(split+1,size-j); 
    } 
    return; 
} 

это хорошо, однако, она входит в бесконечную рекурсию или бесконечный цикл сразу же после первого разделения прохода. Как я могу это решить?

+0

подкачки определяется как макро: '#define подкачки (A, B) ({\ TypeOf (а) __c = (а); \ а = Ь; \ Ь = __ с; \ })' –

+1

«* Как я могу это решить? *" Компилировать с символами (опция '-g' для gcc) и запускать код в отладчике (gdb для gcc), что позволяет проследить его шаг за шагом и проверить все соответствующие переменные , – alk

+0

0) когда [5,5,5] _infinite loop_ на do-while. 1) 'array [size]' находится за пределами границ. – BLUEPIXY

ответ

0

Ваш код разбивки выглядит странным, и в нем есть по крайней мере несколько ошибок: для (; a [i] < p; i ++) не может быть завершен.

А затем, если j является конечной позицией элемента поворота, ваш левый массив должен быть отсортирован с помощью quicksort (array, j), а не j-1.

+0

Я не уверен, что это решает, потому что OP использует 'swap (array [j], array [size]);' not 'swap (array [j], array [size-1]);' –

0

Я не мог скомпилировать ваш код (мой компилятор устарел). Но не следует:

size_t i=0; 

быть вместо этого инициализируется как 1, так как у вас есть

int64_t p=array[0]; // partition element? 

и

for (;array[i]<p;i++); 

То есть, вероятно, не единственная проблема.