Сортировка по чертям этого - Quicksort - PullRequest
10 голосов
/ 24 апреля 2011

Мы должны сделать оптимизированную быструю сортировку для нашего собственного базового класса Comparable.За свою жизнь я не могу заставить это работать.Алгоритм кажется прямым, но я не вижу, чтобы мой код работал.У меня есть класс DateTime, который расширяет Comparable, который я использую для тестирования, и сортировка, кажется, работает, но один из каждых 20 или около того запускает одно значение неуместно, и когда я использую сортировку вставкой на куски массива, которые меньшечем 8, весь вид теряется.

В моем методе разбиения это работает, когда я перемещаю шарнир до конца и запускаю указатели в начале и в конце - 1. Я хочу переместитьpivot to end - 1, потому что первый и последний уже отсортированы и запускают указатели с первого + 1 и с конца -2, но, если я пытаюсь это сделать, все разваливается, и я не понимаю, почему.

Итак, у меня естьто, что работает сейчас.Это становится немного спастическим, когда я не использую сортировку вставки на меньших подмассивах, что надоедает, но я в конце концов не пойму это.Спасибо Бен 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 Ответ

4 голосов
/ 24 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...