По ходу изучения предмета Алгоритмы и структуры данных, знакомлюсь с разными алгоритмами сортировки, конкретно с quick sort на данном этапе, задался задачей самостоятельно его реализовать, исходя из понимания прочитанной мной концепции, основными критериями описания функции были:
Мой код:
template <typename T>
void quick_sort(T* unsorted, unsigned size)
{
if (size < 2) return;
unsigned left = 0;
unsigned right = size - 1;
T middle = unsorted[size >> 1];
while (left != right)
if (unsorted[left] > middle)
while (left != right)
if (unsorted[right] <= middle)
{
T temp = unsorted[left];
unsorted[left] = unsorted[right];
unsorted[right] = temp;
break;
}
else right--;
else left++;
quick_sort(unsorted, left);
quick_sort(unsorted + left, size - left);
}
Вот скрин результатов выполнения сортировки массива из 128 случайных значений:
Проблема в том, что он исходя из всей логики все же сортируется по возрастанию, но дает осечку примерно через каждые 10 шагов, предполагаю, что либо из-за того что при разбиении на 2 функции пропускается шаг, либо из-за не учета при проверке равных опорному элементов.
Надеюсь на вашу внимательность, если кто заметит утечку, либо подскажет, что следует изменить, жду ваших ответов..
Рекурсивные вызовы для левой и правой части:
quick_sort(unsorted, left + 1);
quick_sort(unsorted + left, size - left);
Складываем ваши размеры левой и правой части:
left + 1 + size - left = size + 1
Нестыковочка получается! Почему вдруг суммарный размер получился больше исходного? Если не гарантируется уменьшение размера, то не гарантируется и завершение рекурсии.
И действительно, на входе { 1, 2, 3, 6 } ваша реализация впадает в бесконечную рекурсию. Так что ваше "дает осечку примерно через каждые 10 шагов" - это вам просто повезло.
22 25 25 25 19 26
Результат надо проверять на нескольких исходных данных и проверять автоматически. И в конце должно быть примерно:
quick_sort(unsorted, rootelpos);
quick_sort(unsorted+rootelpos+1, size - rootelpos - 1);
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости