这是分析扑克赔率的程序的一部分,特别是德州扑克。我有一个我很满意的程序,但它需要一些小的优化才能完美。
我使用这种类型(当然还有其他类型):
type
T7Cards = array[0..6] of integer;
在决定如何排序时,关于这个数组有两点可能很重要:
- 每一项都是 0 到 51 之间的值。没有其他可能的值。
- 没有重复项。从来没有。
有了这些信息,绝对最快排序这个数组的方法是什么?我使用 Delphi,所以 pascal 代码是最好的,但我可以阅读 C 和伪代码,尽管速度有点慢:-)
目前我使用快速排序,但有趣的是,这几乎不比冒泡排序快!可能是因为元素数量少。排序占该方法总运行时间的近50%。
编辑:
Mason Wheeler 问为什么有必要进行优化。原因之一是该方法将被调用 2118760 次。
基本扑克信息:所有玩家发两张牌(口袋),然后发五张牌到 table 上(前 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;
当我写这篇文章时,我注意到一件事:数组的最后五个元素将始终排序,所以这只是将前两个元素放在数组中正确位置的问题。这应该会简化一些事情。
因此,新问题是:当最后 5 个元素已排序时,对包含 7 个整数的数组进行排序的最快方法是什么。我相信这可以通过几个(?)if's 和 swaps 来解决:-)
最佳答案
对于非常小的集合,insertion sort通常可以击败快速排序,因为它的开销非常低。
WRT 你的编辑,如果你已经大部分按排序顺序(最后 5 个元素已经排序),插入排序绝对是可行的方法。在几乎已排序的数据集中,它每次都会击败快速排序,即使对于大型数据集也是如此。 (特别是对于大集合!这是插入排序的最佳情况和快速排序的最坏情况。)
关于algorithm - 对包含 7 个整数的数组进行排序的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1415173/