Программист-новичок пытается реализовать быструю сортировку, но это не сработает. Я посмотрел на онлайн-ресурсы, но я просто не могу обнаружить ошибку в моей реализации. Заранее спасибо.
РЕДАКТИРОВАТЬ Проблема У меня, кажется, застревает в функции быстрой сортировки, и программа просто зависает. Когда я попытался отладить его с помощью printf, исходный массив, похоже, был изменен с неожиданными числами (не из исходного списка), такими как 0.
void quicksort(int a[], const int start, const int end)
{
if( (end - start + 1 ) < 2)
return;
int pivot = a[rand()%(end - start)];
//Two pointers
int L = start;
int R = end;
while(L < R)
{
while(a[L] < pivot)
L++;
while(a[R] > pivot)
R--;
if(L < R)
swap(a,L,R);
}
quicksort(a, start, L-1);
quicksort(a, L+1, end );
}
void swap(int a[], const int pos1, const int pos2)
{
a[pos1] ^= a[pos2];
a[pos2] ^= a[pos1];
a[pos1] ^= a[pos2];
}
int main()
{
int array[20] = {0};
int size = sizeof(array)/sizeof(array[0]);//index range = size - 1
int i = 0;
printf("Original: ");
for (i; i < size; i++)
{
array[i] = rand()%100+ 1;
printf("%d ", array[i]);
}
printf("\n");
quicksort(array,0,size-1);
int j = 0;
printf("Sorted: ");
for(j; j < size; j++)
printf("%d ", array[j]);
printf("\n");
}
Дополнительный вопрос: Что касается рекурсивного вызова быстрой сортировки, будут ли указатель влево и вправо всегда указывать в направлении оси в конце каждого раздела? Если это так, правильно ли вызывать быструю сортировку от начала до L-1 и L + 1 до конца?
Кроме того, требуется ли if (L