Проще говоря, быстрая сортировка Хоара работает следующим образом:
- имея массив данных
- выбирая некоторый средний элемент
- логически разделяя массив на 3 категории:
- все, что находится слева от среднего элемента - мы назовем это нижней частью
- средним элементом
- все, что находится справа от среднего элемента - мы назовите это верхним разделом
- запоминая значение в среднем элементе
- , начиная с самого левого края нижнего раздела, ища значение, которое больше среднего элемента , или, другими словами, он пытается найти что-то, чего не должно быть в нижнем разделе, потому что он слишком большой
- , когда он находит его, он начинает с правой стороны верхнего раздела в поисках элемента, который "слишком мало для верхней части"
- , если найдены значения, соответствующие этим критериям, они меняются местами на
- , это происходит неоднократно, пока все, что i s слишком большой для нижней части был перенесен в верхнюю часть, а все слишком маленькое для верхней части было перенесено в нижнюю часть
- в результате получился «частично отсортированный» массив; все, что слева от среднего элемента, меньше его, и все, что справа от среднего элемента, больше его
- алгоритм начинается заново, на этот раз обрабатывая только нижнюю часть, как если бы это был весь массив , затем он делает то же самое с верхней частью
- , беря целое, затем делите его пополам, затем четверть, затем ... вы достигаете точки, в которой просто проверяете, что группа пар или отдельные элементы сортируются, и затем все готово.
Ваш алгоритм использует что-то вроде смеси стратегий разделения Хоара и Ломуто, но в основном больше похоже на Ломуто. Существуют различные стратегии разделения (выбор способа разделения массива на разделы) в зависимости от того, как работает контейнер данных (стратегия Хоара требует наличия контейнеров, к которым можно произвольно обращаться или к которым можно получить доступ с каждого конца, например, список с двойной связью, Ломуто нужен только контейнер данных для чтения в одном направлении), но алгоритм быстрой сортировки basi c состоит в том, что вы разбиваете все на две стопки: «хотите меньшие значения» и «хотите большие значения», постоянно меняя местами между стопками, пока не станет «меньше» и "больше" действительно верно, затем повторите процесс сначала с меньшей кучей, затем с большей кучей. Если вы продолжите и разделите работу, то вы достигнете точки, где все будет рассортировано.
Если вы все еще боретесь с этим, возможно, вместо этого подумайте: если вы думаете об этом как о сортировке большого количества слов, которые используйте только символы A и Z, в алфавитном порядке у вас может быть стратегия размещения всего в стопки: 2 стопки из тех, которые начинаются с A, и тех, которые начинаются с Z. Затем вы делаете 4 стопки, те, которые начинаются с AA, AZ, ZA и ZZ. Затем вы переходите к 8 стопкам из трех букв AAA, AAZ, AZA, AZZ, ZAA, ZAZ, ZZA и ZZZ (что, вероятно, уместно, если вы уже спите ?). Это тоже стратегия «разделяй и властвуй»; вы достигнете точки, когда вы разделили стопки так, что каждая из них содержит только одну вещь, тогда, если вы собираете стопки по порядку (и если вы были осторожны, когда вы их разложили, они уже будут в порядке ), то они сортируются
О, и в вашем коде есть ошибка в том, что вы добавили точку с запятой после if, которая создает пустой оператор (делает if бесполезным), и вы также не кажетесь использовать временный массив, который вы носите с собой. Это похоже на то, что al go надеялся стать смесью двух разных стратегий сортировки, но это незаконченный