Сортировка, черт возьми - Quicksort

Мы должны сделать оптимизированную быструю сортировку для нашего собственного базового класса 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;
}
10
задан Bill the Lizard 16 September 2012 в 22:21
поделиться