按第二维度对二维数组进行排序 - 页 3

 
cameofx wrote>>
这些也是我想象的方式。我引用的关于第一维度的参考资料让我感到困惑...(见上面的帖子)。所以我们在逻辑上不能调整ColumnNumber和/或WorksheetNumber和/或BookNumber的大小。
和/或BookNumber...只有RowNumber。这是二维、三维和四维数组中最左边的一对括号。


戈登已经确认了,但由于你引用了我的例子,我不得不也回应一下,以确认你对我帖子的解释是正确的。

 
1005phillip:


戈登已经确认了,但由于你引用了我的例子,我不得不也回应一下,以确认你对我帖子的解释是正确的。

那个帖子是为了回复你的,我忘了称呼你的名字,我的错误 :)

 

好吧,这是个老话题了,但这段代码可能会帮助人们对第二条暗线进行分类。

int start(){

   double ldDest[6][2];
   double ldSource[6][2];
   ldSource[0][0] = 643;
   ldSource[0][1] = 3236;
   ldSource[1][0] = 46769;
   ldSource[1][1] = 523;
   ldSource[2][0] = 234;
   ldSource[2][1] = 435;
   ldSource[3][0] = 854;
   ldSource[3][1] = 3344;
   ldSource[4][0] = 8465;
   ldSource[4][1] = 2434;
   ldSource[5][0] = 1545;
   ldSource[5][1] = 341;
   _ArraySort2D(ldDest, ldSource, 1);
   for (int i = 0; i < ArrayRange(ldDest,0); i++){      
      Print(i," ",1,"= ",ldDest[i,1]);    
   }
}

void _ArraySort2D(double &rdDest[][], double _dSource[][], int _iSortIndex){
   
   int liSize[2];
   liSize[0] = ArrayRange(_dSource, 0);
   liSize[1] = ArrayRange(_dSource, 1);
   int liPosition;
   
   for (int i = 0; i < liSize[0]; i++){
      liPosition = 0;
      for (int j = 0; j < liSize[0]; j++){
         if (_dSource[i,_iSortIndex] > _dSource[j,_iSortIndex]){
           liPosition++;
         }
      }
      ArrayCopy(rdDest, _dSource, liPosition*liSize[1], i*liSize[1],  liSize[1]);
   }
}
 
void _ArraySort2D(double &rdDest[][], double _dSource[][], int _iSortIndex, int _iDirection=MODE_ASCEND){
   
   int liSize[2];
   liSize[0] = ArrayRange(_dSource, 0);
   liSize[1] = ArrayRange(_dSource, 1);
   int liPosition;
   
   for (int i = 0; i < liSize[0]; i++){
      switch(_iDirection){
         case MODE_ASCEND:
            liPosition = 0;
            for (int j = 0; j < liSize[0]; j++){
               if (_dSource[i,_iSortIndex] > _dSource[j,_iSortIndex]){
                 liPosition++;
               }
            }
            ArrayCopy(rdDest, _dSource, liPosition*liSize[1], i*liSize[1],  liSize[1]);
            break;
         case MODE_DESCEND:
            liPosition = liSize[0]-1;
            for (j = 0; j < liSize[0]; j++){
               if (_dSource[i,_iSortIndex] > _dSource[j,_iSortIndex]){
                 liPosition--;
               }
            }
            ArrayCopy(rdDest, _dSource, liPosition*liSize[1], i*liSize[1],  liSize[1]);
            break;
      }
   }
}
和递减....
 
排序的替代方法是制作一个索引表。
// Cog[], Cog.EMA[], Cog.EMA.prev[], Cog.ticket[]

    int order[COGLINES];                // Keep relative ordering of Cog,
    for (int kk=0; kk<COGLINES; kk++) { // Cog.EMA, Cog.EMA.prev and COG.ticket
        for (int ii=kk; ii>0 && COG[order[ii-1]] > COG[kk]; ii--) {
            order[ii]=order[ii-1];  // kk   cog[kk] order[kk]   cog[order[kk]]
        }                           // 0    3.      1           1.
        order[ii]=kk;               // 1    1.      2           2.
    }                               // 2    2.      0           3.

更快,并且允许不同的数据类型在不同的一维数组中使用可理解的变量名称。

AryBuy[1][0] contains the ticket, AryBuy[1][1] contains the price.

int Buy.Ticket[] 和 double Buy.Price[] 更容易理解,并且包含正确的数据类型。
 
LEHayes:


我真的很累,而且因为要把大约5个战略的发布推到门外而疲惫不堪,所以这成了一个小小的好事,而不是一个必要的事。我愿意和任何能够为我写这个功能的人做个交易。我将给你提供你所选择的产品和多年的许可证,因为你帮助我解决了这个问题,而且我还将给你一份这个对冲策略的个人副本,供你终身免费使用。我只是太忙了,无法做到这一切,我的开发团队在发布已经在我们的盘子里的东西方面负担很重。我想整个团队的平均睡眠值大约是每天4到6小时。

显然,我不是那个可以随时为你做这些事情的人,虽然我想,当我在Arrays上爬坡的时候;但我还是会被停车场的坑洞和石头绊倒..... . .

从你和这里的其他知识渊博的程序员所做的工作来看,你有一个解决方案,尽管是个小问题:只是需要有人花时间来做。

另外:周围有许多mql 4 <=> Excel接口。虽然Excel v2007有一个错误,不允许工作表在制作完成后被放大:只是一个小的不便。不是!非常糟糕的是,到目前为止还没有修复它,但在真正的MS时尚,可能会留下它,然后用它作为额外的诱因来购买最新的v201x,当它出来的。

你有那么多的产品 在架子上待命,也许是时候换个帽子,离开编码的笼子一段时间,专注于一些市场和销售?

 

Russel & WHRoeder,非常感谢你们。这些会有很大的帮助!
我是一个自学成才的程序员。你不知道我的动作 有多慢,如果我自己去安装和做测试(这是我经常去搞清楚的事情......)。

@FourX : 继续努力...一次一个数组,你最终会成功的...

 
Russell:
和descending....

嗨,罗素


你建议的算法工作得很好,只是当数组中有2个或2个以上的元素携带相同的值时,它无法进行排序。例如,ldSource[2][1] = 435,ldSource[3][1] = 435。对这种情况有什么建议吗?谢谢



   ldSource[0][0] = 643;
   ldSource[0][1] = 3236;
   ldSource[1][0] = 46769;
   ldSource[1][1] = 523;
   ldSource[2][0] = 234;
   ldSource[2][1] = 435;
   ldSource[3][0] = 854;
   ldSource[3][1] = 435;
 
whroeder1:
替代排序的方法是制作一个索引表。

更快,并且允许在不同的一维数组中使用可理解的变量名的不同数据类型。

int Buy.Ticket[] 和 double Buy.Price[] 更容易理解,并且包含正确的数据类型。

这是一个非常有用的帖子,涵盖了我在其他地方没有看到的详细讨论的重要 方法。

我有一个需要用插入式排序来构造索引的情况,与此类似。

请问是否有错别字--按照我的理解,变量ii只存在于for循环的主体内?

我知道这可能是未经测试的示例代码或经过轻度编辑的工作代码,我并不是想迂腐,但我很好奇。

非常感谢你经常发表内容丰富的帖子。

 

在我看来,代码#23和#24真的需要唯一的键来对它们进行排序...

我自己有时也在使用#25的逻辑