Мы должны сделать оптимизированную быструю сортировку для нашего собственного базового класса Comparable. Да хоть убей, я не могу заставить его работать. Алгоритм кажется простым, однако я не вижу, чтобы мой код работал. У меня есть класс DateTime, который расширяет Comparable, который я использую для тестирования, и сортировка, похоже, работает, но один из каждых 20 или около того запусков одно значение неуместно, и когда я использую сортировку вставкой для фрагментов массива, которые меньше чем 8, вся сортировка вылетает из строя.
В моем методе разбиения это вроде работает, когда я перемещаю точку поворота в конец и начинаю свои указатели в начале и в конце - 1. Я хочу переместить точку поворота в конец - 1, потому что первый и последний уже отсортированы и начинают указатели с первого +1 и конца -2, но все разваливается, если я попробую это сделать, и я не понимаю почему.
Итак, у меня есть кое-что, что теперь работает. Когда я не t использовать сортировку вставкой на меньших подмассивах, что в конечном итоге беспокоит, но плохо разобраться. Спасибо 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;
}