Это часть программы, которая анализирует шансы покера, в особенности Техасский Холдем. У меня есть программа, которой я доволен, но для ее совершенствования требуется небольшая оптимизация.Каков самый быстрый способ сортировки массива из 7 целых чисел?
Я использую этот тип (в том числе, конечно):
type
T7Cards = array[0..6] of integer;
Есть две вещи этого массива, которые могут быть важны при принятии решения о том, как сортировать его:
- Каждый элемент значение от 0 до 51. Никакие другие значения не возможны.
- Нет дубликатов. Никогда.
С этой информацией, что такое абсолютно быстрый способ сортировать этот массив? Я использую Delphi, поэтому код pascal был бы лучшим, но я могу читать C и псевдо, хотя и немного медленнее :-)
В настоящее время я использую quicksort, но самое забавное, что это почти не быстрее чем пузырьки! Возможно из-за небольшого количества предметов. Сортировка составляет почти 50% от общего времени работы метода.
EDIT:
спросил Мейсон Wheeler, почему это необходимо оптимизировать. Одна из причин заключается в том, что метод будет называться 2118760 раз.
Основная информация о покере: всем игрокам раздаются две карты (карман), а затем пять карт раздаются к столу (3 сначала называются флопом, следующий - поворот, а последний - рекой. выбирает пять лучших карт, чтобы сделать свою руку)
Если у меня есть две карты в кармане, P1 и P2, я буду использовать следующие циклы для генерации всех возможных комбинаций:
for C1 := 0 to 51-4 do
if (C1<>P1) and (C1<>P2) then
for C2 := C1+1 to 51-3 do
if (C2<>P1) and (C2<>P2) then
for C3 := C2+1 to 51-2 do
if (C3<>P1) and (C3<>P2) then
for C4 := C3+1 to 51-1 do
if (C4<>P1) and (C4<>P2) then
for C5 := C4+1 to 51 do
if (C5<>P1) and (C5<>P2) then
begin
//This code will be executed 2 118 760 times
inc(ComboCounter[GetComboFromCards([P1,P2,C1,C2,C3,C4,C5])]);
end;
Как я пишу это я замечаю еще одно: последние пять элементов массива всегда будут отсортированы, поэтому речь идет только о том, чтобы первыми двумя элементами были права позиции в массиве. Это должно немного упростить ситуацию.
Итак, новый вопрос: какой самый быстрый способ сортировать массив из 7 целых чисел, когда последние 5 элементов уже отсортированы. Я считаю, что это можно решить с помощью пары (?) If и swaps :-)
Я должен знать, почему вы ищете самый быстрый способ сортировки такого небольшого набора? В этом масштабе даже сортировка пузырьков закончится менее чем за миллисекунду на любом доступном CPU. –
Вставка сортировки или выбора сортировки. – yfeldblum
Комментарий от Мейсона Уилера заставил меня немного изменить вопрос. Процедура, в которой происходит сортировка, будет называться 2118760 раз, поэтому даже если одна сортировка занимает всего миллисекунду, процедура займет секунд. Эта процедура будет называться 2652 раза для анализа коэффициентов для всех возможных комбинаций с двумя картами. –