Быстрая сортировка C++ (qsort)

284
11 января 2018, 22:49

По ходу изучения предмета Алгоритмы и структуры данных, знакомлюсь с разными алгоритмами сортировки, конкретно с 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 функции пропускается шаг, либо из-за не учета при проверке равных опорному элементов.
Надеюсь на вашу внимательность, если кто заметит утечку, либо подскажет, что следует изменить, жду ваших ответов..

Answer 1

Рекурсивные вызовы для левой и правой части:

quick_sort(unsorted, left + 1);
quick_sort(unsorted + left, size - left);

Складываем ваши размеры левой и правой части:

left + 1 + size - left = size + 1

Нестыковочка получается! Почему вдруг суммарный размер получился больше исходного? Если не гарантируется уменьшение размера, то не гарантируется и завершение рекурсии.

И действительно, на входе { 1, 2, 3, 6 } ваша реализация впадает в бесконечную рекурсию. Так что ваше "дает осечку примерно через каждые 10 шагов" - это вам просто повезло.

Answer 2

22 25 25 25 19 26

Результат надо проверять на нескольких исходных данных и проверять автоматически. И в конце должно быть примерно:

quick_sort(unsorted, rootelpos);
quick_sort(unsorted+rootelpos+1, size - rootelpos - 1);
READ ALSO
V8 engine. Как создать callback (без Node JS)?

V8 engine. Как создать callback (без Node JS)?

Пытался я создать callback в v8 js engine но что то не получаетсяТо есть у меня не получается сохранить функцию чтобы потом ее вызвать

234
Проблема со взаимодействием Python и С++: could not find or load the Qt platform plugin &ldquo;windows&rdquo;

Проблема со взаимодействием Python и С++: could not find or load the Qt platform plugin “windows”

Добрый деньНачал изучение Python и столкнулся с проблемой, в сопряжении С++ и python 3

239
Проблемы с Qt Creator

Проблемы с Qt Creator

У меня уже больше года стоит Qt Creator 35

265