Сортировка для этого - Quicksort

Мы должны сделать оптимизированную 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;
}

Ответ 1

Из кода, который вы нам показали, и вашего комментария о том, что пойдет не так, я только предполагаю, что from и to не означает, что вы думаете. Ваш код имеет to - from как длину сегмента для сортировки. Если это точный (а не только приблизительный для выбора поворота), это означало бы, что to фактически указывал на элемент, расположенный за пределами области для сортировки. Это разумно, но тогда swap<Comparable*>(*pivot, *(to)) будет обменивать точку поворота с конца списка.