algorithm - 对包含 7 个整数的数组进行排序的最快方法是什么?

标签 algorithm delphi sorting pascal

这是分析扑克赔率的程序的一部分,特别是德州扑克。我有一个我很满意的程序,但它需要一些小的优化才能完美。

我使用这种类型(当然还有其他类型):

  type
    T7Cards = array[0..6] of integer;

在决定如何排序时,关于这个数组有两点可能很重要:

  1. 每一项都是 0 到 51 之间的值。没有其他可能的值。
  2. 没有重复项。从来没有。

有了这些信息,绝对最快排序这个数组的方法是什么?我使用 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/

相关文章:

c# - WP7 上的 FFT 显示两个镜子

algorithm - 通过最近范围的索引填充二维数组

algorithm - 如何计算列表中的唯一项?

delphi - delphi中枚举注册表子项

Delphi 2010内联没用吗?

c++ - 用于查找 f(Xi) 的最小值的索引的标准或 boost 算法

Delphi - 失去焦点时在 RichEdit 中保持突出显示的选择

c# - 如何在 dataGrid 中将 XML 中的数据排序为数字

python - 按一列然后另一列(作为子集)对 numpy 进行排序,同时保留行顺序

Javascript - 在两组数字之间添加缺失值