Мы должны сделать оптимизированную quicksort для собственного базового класса Comparable. Для жизни меня я не могу заставить ее работать. Алгоритм кажется прямым, но я не вижу, чтобы мой код работал. У меня есть класс DateTime, который расширяет Comparable, который я использую для тестирования, и сортировка, похоже, работает, но один из каждых 20 или около того запускает одно значение, неуместно, и когда я использую сортировку вставки на кусках массива, которые меньше чем 8, весь сорт выкидывается из-под удара.
В моем методе разделения это работает, когда я перемещаю точку поворота до конца и начинаю свои указатели в начале и в конце - 1. Я хочу переместить точку поворота в конец - 1, потому что первая и последняя уже отсортированы и начните указатели сначала + 1 и конец -2, но все развалится, если я попробую это, и я не понимаю, почему.
Итак, у меня есть что-то, что работает сейчас. Это становится немного спазматичным, когда я не использую сортировку вложения по более мелким вспомогательным массивам, которые в конечном итоге беспокоят, но в конечном итоге это плохо. Благодаря ben j для указания на выпадение массива... это вызывало проблему сортировки вставки.:)
Мой текущий код ниже
Comparable** partition(Comparable** from, Comparable** to)
{
Comparable** pivot = from + (to - from) / 2;
SortFirstMiddleLast(from, pivot, to - 1);
swap(*pivot, *to);
pivot = to;
++from; to -= 2;
while (from <= to)
{
while (**from <= **pivot && from <= to) ++from;
while (**to >= **pivot && from <= to) --to;
if (from < to)
{
swap(*from, *to);
++from; --to;
}
}
swap(*from, *pivot);
return from;
}