Это часть программы, которая анализирует шансы в покере, особенно в техасском холдеме. У меня есть программа, которой я доволен, но для идеальной работы требуется небольшая оптимизация.
Я использую этот тип (среди прочих, конечно):
type
T7Cards = array[0..6] of integer;
В этом массиве есть две вещи, которые могут быть важны при принятии решения о том, как его отсортировать:
- Каждый элемент имеет значение от 0 до 51. Никакие другие значения невозможны.
- Дубликатов нет. Никогда.
Имея эту информацию, каков самый быстрый способ отсортировать этот массив? Я использую Delphi, поэтому лучше всего подойдет код на паскале, но я могу читать C и псевдо, хотя и немного медленнее :-)
На данный момент я использую быструю сортировку, но самое забавное, что она почти не быстрее пузырьковой сортировки! Возможно из-за небольшого количества позиций. На сортировку уходит почти 50% от общего времени работы метода.
РЕДАКТИРОВАТЬ:
Мейсон Уиллер спросил, зачем нужна оптимизация. Одна из причин заключается в том, что метод будет вызываться 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 и свопов :-)