Я пытаюсь разработать эффективный quicksort
algo. Он работает нормально, но занимает много времени, когда количество элементов огромно, а некоторые разделы массива предварительно отсортированы. Я искал статью в Wikipedia по quicksort
, и там я нашел это написано:
Чтобы убедиться, что используется не более O (лог-N), сначала запишите сначала в меньшую половину массива и используйте хвостовой вызов для повторной обработки в другой.
Использовать сортировку вставки, которая имеет меньший постоянный коэффициент и, следовательно, быстрее на небольших массивах, для вызовов на таких небольших массивах (т.е. где длина меньше порогового значения t, определенного экспериментально). Это может быть реализовано, если оставить массивы несортированными и запустить один проход сортировки в конце, потому что вставка сортирует обрабатывает почти отсортированные массивы эффективно. Отдельный тип вставки каждого маленького сегмента по мере их идентификации добавляет накладные расходы при запуске и остановке многих мелких родов, но позволяет избежать траты усилий, сравнивающих ключи по многим границам сегмента, которые будут в порядке из-за работы процесса быстрой сортировки. Это также улучшает использование кеша.
В настоящее время я рекурсирую для обоих разделов. Любая идея, как реализовать первый совет? Что означает recurse сначала в меньшую половину массива и использовать хвостовой вызов для рекурсии в другой? А во-вторых, как я могу реализовать insertion-sort
в quicksort? Будет ли это всегда повышать эффективность или только когда предварительно разделены некоторые разделы массива? Если это второй случай, то, конечно, я не знаю, когда это произойдет. Поэтому, когда я должен включить insertion-sort
?