сортировка двумерного массива по второму измерению - страница 3

 
cameofx wrote >>
Я тоже так себе это представлял. Ссылка, которую я цитировал относительно первого измерения, сбила меня с толку... (см. сообщение выше). Так что мы логически не можем изменить размер ColumnNumber и/или WorksheetNumber
и/или номер книги... только номер строки. Который является самой левой парой скобок в 2D, 3D и 4D массивах.


Гордон уже подтвердил, но поскольку вы процитировали мой пример, я вынужден ответить также, чтобы подтвердить, что ваша интерпретация моего сообщения верна.

 
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:
и убывающий....

Привет Рассел


Предложенный вами алгоритм работает довольно хорошо, но когда в массивах 2 или более элементов имеют одинаковое значение, он не может выполнить сортировку. Например, ldSource[2][1] = 435, ldSource[3][1] = 435. Посоветуйте что-нибудь для такого случая. Thx



   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 я иногда использую сам.