Скачать MetaTrader 5

Сортировка массива.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Nefedov Kirill
2888
Nefedov Kirill  

Всем привет.

Что-то в ступоре. Есть массив чисел 90; 80; 70; 60; 50; 40; 30; 20; 10; -10; -20; -30; -40; -50; -60; -70; -80; -90;

Как данный массив отсортировать для получения результата: 90; -90; 80; -80; 70; -70; 60; -60; 50; -50; 40; -40; 30; -30; 20; -20; 10; -10;

Или подскажите как называется такой метод сортировки?

IgorM М
4801
IgorM М  
по видимому Вы сортируете по модулю числа, если это так, тогда нужно написать алгоритм сортировки по модулю и выставление знака, думаю с помощью двух массивов (в одном модули, а во втором знаки числа) получится
o_o
Модератор
24106
o_o  
HIDDEN:

Всем привет.

Что-то в ступоре. Есть массив чисел 90; 80; 70; 60; 50; 40; 30; 20; 10; -10; -20; -30; -40; -50; -60; -70; -80; -90;

Как данный массив отсортировать для получения результата: 90; -90; 80; -80; 70; -70; 60; -60; 50; -50; 40; -40; 30; -30; 20; -20; 10; -10;

Или подскажите как называется такой метод сортировки?

да. сортируйте все числа (например методом пузырька), только анализируйте их по модулю, НО в сам массив вносите как есть.

у вас получится в большинстве случаев А -А В -В, но иногда -В В -С С

поэтому последним этап просто пройдитесь по массиву и поменяйте местами пары, чтоб справа было отрицательное число.

Mislaid
602
Mislaid  

Определите двухмерный массив b[][]. В первом измерении b[i,0] укажите абсолютное значение, во втором b[i,1] - знак. А потом используйте процедуру ArraySort()

PS Если вы хотите, чтобы сначала шли положительные числа, а затем отрицательные, то это возможно, если вы знаете величину дискретизации. Например, вы имеете дело с ценами. Величина дискретизации Point. Целые числа - величина дискретизации 1.

В первом измерении абсолютные значения увеличиваете для положительных, а для отрицательных уменьшаете, на величину, намного меньшую величины дискретизации.

Nefedov Kirill
2888
Nefedov Kirill  

Что-то у меня не пузырится массив в ни по модулю, ни как-то по другому.

Вот моя реализация задачи:

#property copyright "Copyright © 2010, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
double Array[] = { 50, 40, 30, 20, 10, -10, -20, -30, -40, -50 };
double Array2[];
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start(){
//----
   int index = 0;
   ArrayResize(Array2, ArraySize(Array));

while (ArraySize(Array)!=0){
      int x=0;
      Array2[x] = ArrayMax(Array);
      index = ArraySearchDouble(Array, Array2[x]);
      ArrayDeleteDouble(Array, index);
      Print(Array2[x]);
      Array2[x] = ArrayMin(Array);
      index = ArraySearchDouble(Array, Array2[x]);
      ArrayDeleteDouble(Array, index);
      Print(Array2[x]);
      x++;
}
 
//----
   return(0);
  }
//+------------------------------------------------------------------+

int ArrayDeleteDouble(double& Arr[], int i) {
  int a, b=ArraySize(Arr);

  if (i>=0 && i<b) {
    for (a=i; a<b; a++) Arr[a]=Arr[a+1];
    b=ArrayResize(Arr, b-1);
    return(b);
  }
  return(-1);
}

double ArrayMax(double& Arr[]) {
  if (ArraySize(Arr)>0) return(Arr[ArrayMaximum(Arr)]);
}

double ArrayMin(double& Arr[]) {
  if (ArraySize(Arr)>0) return(Arr[ArrayMinimum(Arr)]);
}

int ArraySearchDouble(double& Arr[], double e) {
  for (int i=0; i<ArraySize(Arr); i++) {
    if (Arr[i]==e) return(i);
  }
  return(-1);
}

Возможно не идеальный вариант, но рабочий.

Хотя было бы интересно посмотреть коды предложенных вариантов реализации.

IgorM, sergeev, Mislaid если Вас не затруднит напишите свой код в образовательных целях.

Vladyslav Goshkov
2144
Vladyslav Goshkov  
HIDDEN:

Что-то у меня не пузырится массив в ни по модулю, ни как-то по другому.

Вот моя реализация задачи:

Возможно не идеальный вариант, но рабочий.

Хотя было бы интересно посмотреть коды предложенных вариантов реализации.


У Вас и так массив отсортирован. Самый быстрый способ - учесть структуру данных ;) :

double Array[] = { 50, 40, 30, 20, 10, -10, -20, -30, -40, -50 };
double Array2[];
int start()
  {
//----
int aSz = ArraySize(Array);
   ArrayResize(Array2,aSz);
   int j=aSz-1;
   int i=0;
   for(int k=0;k<aSz;k+=2,i++,j--)
   {
       Array2[k]   = Array[i];
       Array2[k+1] = Array[j];
   }
//----
   for(k=0;k<aSz;k++)
   {
      Print( "Array2[",k,"] = ",Array2[k]);
   }

   return(0);
  }
Nefedov Kirill
2888
Nefedov Kirill  
VladislavVG:

У Вас и так массив отсортирован. Самый быстрый способ - учесть структуру данных ;) :


double Array[] = { 50, -20, -30, 20, 10, -10, 40, -40, -50, 30 };

Если Ваш код применить вот к такому массиву, то сразу не работает.

P.S. Хотя тут наверное моя ошибка, не уточнил, что сортировка должна быть чередование максимум; минимум и т.д. почему-то думалось что это очевидно из приведенного примера.

Vladyslav Goshkov
2144
Vladyslav Goshkov  
HIDDEN:

double Array[] = { 50, -20, -30, 20, 10, -10, 40, -40, -50, 30 };

Если Ваш код применить вот к такому массиву, то сразу не работает.

Вы как задачу поставили ? См пост 1 ....

Есть массив чисел 
90; 80; 70; 60; 50; 40; 30; 20; 10; -10; -20; -30; -40; -50; -60; -70; -80; -90;
Как данный массив отсортировать для получения результата: 
90; -90; 80; -80; 70; -70; 60; -60; 50; -50; 40; -40; 30; -30; 20; -20; 10; -10;
Или подскажите как называется такой метод сортировки?

Этот массив double Array[] = { 50, -20, -30, 20, 10, -10, 40, -40, -50, 30 }; предварительно нужно отсортировать - можно стандартным методом - быстрой сортировкой, например......

И, конечно, с произвольным порядком мой код работать не будет - там же учет структуры данных идет.

Удачи.

hrenfx
3671
hrenfx  
// Сортировка вектора по абсолютному значению элементов
void SortByABS( double& Vector[], int SortType = MODE_ASCEND )
{
  int i, N = ArraySize(Vector);
  double Tmp[][2];
  
  ArrayResize(Tmp, N);
  
  for (i = 0; i < N; i++)
  {
    Tmp[i][0] = MathAbs(Vector[i]);
    Tmp[i][1] = Vector[i];
  }
  
  ArraySort(Tmp, 0, 0, SortType);
  
  for (i = 0; i < N; i++)
    Vector[i] = Tmp[i][1];
    
  return;
}
Nefedov Kirill
2888
Nefedov Kirill  
VladislavVG:

Вы как задачу поставили ? См пост 1 ....

Этот массив double Array[] = { 50, -20, -30, 20, 10, -10, 40, -40, -50, 30 }; предварительно нужно отсортировать - можно стандартным методом - быстрой сортировкой например......

Удачи.


Спасибо за пример. Предварительная сортировка спасает ситуацию.

Если будут еще примеры реализации, то постараюсь сравнить все варианты по скорости выполнения, дабы выбрать наиболее быстрый и корректный способ.

Nefedov Kirill
2888
Nefedov Kirill  

Все приведенные коды не рабочие, т.е. не выполняют задачу максимум - минимам - максимум и т.д. если применять к следующему массиву (предварительная сортировка массива тоже не помогает).

double Array[] = { 50.24, -20.18, -30.55, 50.25, -19.18, -10.22, 40.45, -40.79, -50.12, 30.57 };

Мой код пока еще справляется с задачей.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий