быстрая сортировка. Одна из реализаций
реализовал быструю сортировку , но получилось коряво и наверно много чего там избыточно и не оптимально. И поэтому погуглил и нашёл одну из простеньких реализаций, ну прям очень просто ! и столкнулся с проблемой. Как известно по алгоритму можно найти средний элемент(один из вариантов), потом выставляем слева от него меньшие элементы, а справа большие путем взаимного обмена, затем все повторяется рекурсивно.
сама реализация следующая (функцию 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 есть двойка которая должна стоять левее. Да, это наверно все устаканится при следующих рекурсивных вызовах. Но ведь это нарушение алгоритма ?