Я нашел этот код для быстрой сортировки с фиксированным стержнем. В качестве поворота всегда требуется элемент правой стороны данной таблицы. Я хочу, чтобы он воспринимал случайный элемент как стержень. Я думаю, что x
- это стержень здесь, поэтому я подумал, что было бы неплохо изменить его на случайный элемент из определенного списка, но, оказывается, он не работает.Как изменить итеративную quicksort с фиксированным шарниром на итеративную quicksort со случайным стержнем?
void swap (int* a, int* b)
{
int t = *a;
*a = *b;
*b = t;
}
int partition (int arr[], int l, int h)
{
int x = arr[h];
int i = (l - 1);
for (int j = l; j <= h- 1; j++)
{
if (arr[j] <= x)
{
i++;
swap (&arr[i], &arr[j]);
}
}
swap (&arr[i + 1], &arr[h]);
return (i + 1);
}
void quickSortIterative (int arr[], int l, int h)
{
int stack[ h - l + 1 ];
int top = -1;
stack[ ++top ] = l;
stack[ ++top ] = h;
while (top >= 0)
{
h = stack[ top-- ];
l = stack[ top-- ];
int p = partition(arr, l, h);
if (p-1 > l)
{
stack[ ++top ] = l;
stack[ ++top ] = p - 1;
}
if (p+1 < h)
{
stack[ ++top ] = p + 1;
stack[ ++top ] = h;
}
}
}
Я попытался изменить линии
int x = arr[h];
и
swap(&arr[i+1], &arr[j]);
к
int r = l+rand()%(h-l);
int x = arr[r];
, а затем
swap(&arr[i+1], &arr[r]);
, но это не сортировка должным образом. Очевидно, что я делаю что-то не так. Пожалуйста помоги.
Любая причина, почему рекурсия заменяется использованием массивов переменной длины? Это не спасет вас от переполнения стека. –
@ Alexey Frunze Это мое упражнение в колледже. Я должен сравнивать различные виды сортировщиков. Нет проблем с рекурсивным (с фиксированным и случайным значением), но итеративная проблема была реализована для меня. Я закончил тем, что использовал чей-то код, и это не привело к его пониманию. –