ordenar un array de 2 dimensiones por la segunda dimensión - página 3

 
cameofx wrote >>
La referencia que he citado sobre la primera dimensión me ha despistado (ver post anterior). Así que lógicamente no podemos redimensionar el ColumnNumber y/o WorksheetNumber
y/o BookNumber..solo el RowNumber. Que es el par de corchetes más a la izquierda en arrays 2D, 3D y 4D.


Gordon ya lo confirmó, pero ya que citaste mi ejemplo me veo obligado a responder también sólo para confirmar que tu interpretación de mi post es correcta.

 
1005phillip:


Gordon ya lo ha confirmado, pero ya que has citado mi ejemplo me veo obligado a responder también sólo para confirmar que tu interpretación de mi post es correcta.

Ese post tenía la intención de responder a la suya, me olvidé de abordar su nombre, mi error :)

 

ok tema viejo, pero este código podría ayudar a alguien ordenar el segundo dim.

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;
      }
   }
}
y descendente....
 
La alternativa a la ordenación es hacer una tabla de índices.
// 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.

Más rápido, y permite diferentes tipos de datos con nombres de variables comprensibles en diferentes matrices unidimensionales.

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

int Comprar.Billete[] y double Comprar.Precio[] es más fácil de entender y contiene el tipo de datos correcto.
 
LEHayes:


Estoy realmente cansado y agotado de tratar de empujar la liberación de cerca de 5 estrategias de la puerta, por lo que este se convirtió en un poco de un agradable-dad en lugar de una neccessity.

Estoy dispuesto a hacer un trato con cualquiera que pueda escribir esta función para mí. Le daré su elección de productos con una licencia de años, de forma gratuita por ayudarme en esto y también arrancar, le daré una copia personal de esta estrategia de cobertura para el uso ilimitado de por vida. Estoy demasiado abrumado para hacerlo todo y mi equipo de desarrollo está muy cargado con la liberación de lo que ya está en nuestras placas. Creo que el promedio de sueño en todo el equipo es de 4 a 6 horas al día.

Obviamente no soy el que puede hacer esto por ti, aunque supongo que como estoy subiendo la colina en Arrays; pero todavía estoy tropezando con baches y rocas en el estacionamiento.... . . .

De lo que u tiene y otros programadores bien informados aquí han hashed out usted tiene una solución, aunque un kluge: sólo necesita a alguien a tomar el tiempo y hacerlo.

Además: hay numerosas interfaces mql 4 <=> Excel alrededor. Aunque Excel v2007 tiene un error que no permite ampliar la hoja después de hacerla: sólo un PEQUEÑO inconveniente: ¡NO! Es una lástima que no lo hayan solucionado todavía, pero al estilo de MS, probablemente lo dejarán y lo usarán como un incentivo más para comprar la última versión de Excel cuando salga.

Si tienes tantos productos en la estantería listos para salir, tal vez sea el momento de cambiar de sombrero y salir de la jaula de codificación por un tiempo y centrarse en algo de marketing y ventas.

 

Russel y WHRoeder, muchas gracias. Me han ayudado mucho.
Soy un programador autodidacta. No sabes lo lento que me muevo si tuviera que hacer dispositivos y pruebas por mi cuenta (que es como voy regularmente a averiguar cosas...).

@FourX : Sigue machacando... un array a la vez, al final lo conseguirás...

 
Russell:
y descendiendo....

Hola Russell


Tu algoritmo sugerido funciona bastante bien sólo cuando hay 2 o más elementos que tienen el mismo valor en las matrices, no es capaz de hacer la ordenación... Por ejemplo, ldSource[2][1] = 435, ldSource[3][1] = 435. Alguna sugerencia para este tipo de casos. Gracias



   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:
La alternativa a la ordenación es hacer una tabla de índices.

Más rápido, y permite diferentes tipos de datos con nombres de variables comprensibles en diferentes arrays unidimensionales.

int Buy.Ticket[] y double Buy.Price[] es más fácil de entender y contiene el tipo de datos correcto.

Este es un post muy útil que cubre un enfoque importante que no he visto discutido en detalle en otros lugares.

Tengo la necesidad de construir un índice con una ordenación de inserción en una situación que es similar.

¿Puedo preguntar si hay un error tipográfico - como yo lo entiendo la variable ii sólo existe dentro del cuerpo del bucle for?

Entiendo que esto podría ser un código de ejemplo no probado o un código de trabajo ligeramente editado y no estoy tratando de ser pedante, pero tengo curiosidad.

Muchas gracias por tus frecuentes posts informativos.

 

como veo el código #23 y #24 realmente necesita claves únicas para ordenar según ellos...

la logica de #25 la estoy usando yo mismo a veces

Razón de la queja: