быстрая сортировка. Одна из реализаций

Рейтинг: 1Ответов: 1Опубликовано: 01.06.2023

реализовал быструю сортировку , но получилось коряво и наверно много чего там избыточно и не оптимально. И поэтому погуглил и нашёл одну из простеньких реализаций, ну прям очень просто ! и столкнулся с проблемой. Как известно по алгоритму можно найти средний элемент(один из вариантов), потом выставляем слева от него меньшие элементы, а справа большие путем взаимного обмена, затем все повторяется рекурсивно.

сама реализация следующая (функцию swap не вписывал, думаю её реализация очевидна) :

#include <iostream>
int a[] = { 65,892,2,3,78,-5,41 };
const int SIZE = sizeof(a) / sizeof(*a);
void qsort(int* mas, int s, int e) {   
    if (s > e) return;
    int mid = mas[(s+e)/2];   
    int L = s, R = e;
    while (L<=R) {
        while (mas[L] < mid) L++;
        while (mas[R] > mid) R--;        
        if (L <= R) {
            swap(mas, L, R);
            L++;
            R--;
        }       
    }     
    qsort(mas, e, L);
    qsort(mas, s, R);   
}
int main() {qsort(a, 0, SIZE-1);}

Но вот что интересно для данной последовательности массива из исходника у нас как очевидно должен найтись средний элемент (mid = 3), а затем раскидаться элементы левее те которые меньше и правее которые больше, а потом должны выполниться рекурсивные вызовы для этих двух половин. Однако алгоритм халтурит: при первом же вызове qsort до рекурсивных вызовов массив приобретает вид : {-5, 3, 2, 892, 78, 65, 41} то есть правее mid=3 есть двойка которая должна стоять левее. Да, это наверно все устаканится при следующих рекурсивных вызовах. Но ведь это нарушение алгоритма ?

Ответы

▲ 3Принят

Нет, не нарушение, если до L стоят элементы, меньшие или равные опорному.

З.ы. рекурсивные вызовы с неверными параметрами