Изучая, как писать быстрый вид, я столкнулся с определенной реализацией, которая для меня очень неясна. Вот начало этого:
void quick_sort_iterative(int start, int end)
{
range stack[32]; // 1. why 32? why not 2? why not 1024? what is it?
range * s = stack; // 2. just a simple pointer = an array?
s->start = start; // 3. are these two values currently on top of the stack?
s->end = end;
s++; // 4. how does it work? it pushing something on the stack?
// sort as long as there are any ranges [start, end] to sort left
while (s > stack) // 5. comparing a pointer and an array and it works?
Может ли кто-нибудь объяснить мне эти 5 вещей? :) Спасибо.
Вот весь код (последний на странице, с описаниями): code
Так. Предположительно, range
- это некоторый объект с двумя целыми параметрами: start
и end
. Я не могу сказать гораздо больше.
&stack[0]
.s->start
в данный момент совпадает s[0].start
.s
теперь указывает на &stack[1]
.s
не указывает на &stack[0]
.32
потому что система имела максимальный размер 2 ^ 32 для сортируемого контейнера.
s
и они хотят остановиться, когда он снова достиг вершины стека.
stack = &stack[0]
. Увеличение указателя перемещает указатель на следующий элемент массива. 32 должно быть достаточно для любого :) Хотя возможно построить массив разумного размера, который потребует углубления, превышающего 32.