#c #sorting #quicksort
Вопрос:
Я работаю с большим массивом, около 14400 элементов.
Это моя функция быстрого рассасывания:
void quickSort(slist_struct a[], int l, int h)
{
if (l >= h) return;
slist_struct pivot = a[(l h) / 2];
int i = l, j = h;
while (i < j)
{
while (a[i].data > pivot.data) i ;
while (a[j].data < pivot.data) j--;
if (i <= j)
{
if (i < j) swap(a[i], a[j]);
i ;
j--;
}
}
quickSort(a, l, j);
quickSort(a, i, h);
}
Программа работает хорошо.
Если число элементов достигает 30000, будет ли программа переполнять стек? Спасибо.
Комментарии:
1. Это будет зависеть от размера стека.
2. может быть. может быть, и нет. Зависит от вашего окружения.
3. Если вы хотите уменьшить потребление стека, я предлагаю избавиться от локальной
struct
переменнойpivot
, в этом вообще нет необходимости. Вы можете заменить его указателем или использоватьa[...]
напрямую4. Если ваша цель не состоит в том, чтобы узнать, как реализовать/оптимизировать алгоритм быстрой сортировки, я предлагаю использовать
qsort
стандартную функцию5. Если вы хотите проанализировать использование стека вашей функции, что ж, тогда вам нужно проанализировать ее. Какова средняя глубина рекурсии? Это должно быть O(log(n)), где n — длина массива. Что в худшем случае? Если вы каждый раз получаете наихудший возможный разворот, то разворот будет наименьшим (или наибольшим) элементом, и в этом случае глубина рекурсии будет O(n), и на самом деле это будет n. Так что это зависит от размера массива, а также от того, сильно ли вам не повезет.
Ответ №1:
Попробуйте это изменение:
while (i <= j) /* was while (i < j) */
Ответ №2:
Программа не может переполнить стек.если это произойдет, вместо этого используйте структуру данных очереди. Во-первых, пусть очередь пуста, назовем количество элементов,которые вы хотите отсортировать, равным N. Первый элемент очереди содержит 1, N (очередь[0].L = 1; очередь[0].R = n) .Теперь используйте функцию сортировки (очереди[0].Очереди L..описание[0].Р) но менять
быстрая сортировка(в, Л, к);
быстрая сортировка(с, Я, ч);
к чему-то любит эту
очередь.толчок(я,з);
очередь.нажимаем(л,к);
очередь.поп();
повторите это, пока очередь пуста,
ты нужен полный код?