Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
alhimik7
124
alhimik7  
Здравствуйте! Который день бьюсь над реализацией сортировки массива. Помогите пожалуйста найти ошибку!!!
Алгоритм сортировки таков:
1. Перебираем все индексы массива, находим самое маленькое и самое большое значение, запоминаем индексы
2. в первый индекс ставим самое минимальное, в последний самое максимальное.
3 Следующий перебор начинаем не с первого а со второго, а заканчиваем не последним а предпоследним.
и. т.д

Код ниже:

alhimik7
124
alhimik7  

void OnTick()   { //--- //сортируем массив TmpPriceInaquality[] по убыванию начиная с большего, а с ним и все остальные массивы.    int LockIndex=9;    int TmpPriceInaquality[10]={9,8,7,6,5,4,3,2,1,0};    int TmpFirstOrderOpenPrice[10]={9,8,7,6,5,4,3,2,1,0};    int LockFirstTicket[10]={9,8,7,6,5,4,3,2,1,0};    int LockSecondTicket[10]={9,8,7,6,5,4,3,2,1,0};    int TmpMin=TmpPriceInaquality[0];    int TmpMax=TmpPriceInaquality[LockIndex]; //сдвигаемые с каждым проходом поиска максимального и минимального значения границы стартового и конечного индекса текущего прохода    int StartIndex=0,EndIndex=LockIndex;       Print("Control:PRE_wh:TmpPriceInaquality:");       for(int f=0;f<=LockIndex;f++)         {          Print(" ",TmpPriceInaquality[f]);         }             while(StartIndex<EndIndex)      {       int TmpMinIndex;       int TmpMaxIndex;       Print("StartIndex=",StartIndex);       Print("EndIndex=",EndIndex);       int tmp;       //цикл нахождения максимального и минималного значений в текущем проходе и запоминания индекса       for(int s=StartIndex;s<=EndIndex;s++)         {          if(TmpPriceInaquality[s]<TmpMin)            {             TmpMin=TmpPriceInaquality[s];             TmpMinIndex=s;            }          if(TmpPriceInaquality[s]>TmpMax)            {             TmpMax=TmpPriceInaquality[s];             TmpMaxIndex=s;            }          Print("TmpMin=",TmpMin);          Print("TmpMax=",TmpMax);          Print("TmpMinIndex=",TmpMinIndex);          Print("TmpMaxIndex=",TmpMaxIndex);         }       //меняем местамии значения в найденных индексах, в текущий индекс старта данной итерации прохода пишем минимальное значение, в последний индекс перебора - максимальное,       //также проделываем это с массивами: TmpFirstOrderOpenPrice[z];         LockFirstTicket[z];         LockSecondTicket[z];       //переставляем на нужные места наибольшее и наименьшее найденные в проходе перебора массива TmpPriceInaquality[] значения       tmp=TmpPriceInaquality[StartIndex];       Print("Control1:TmpPriceInaquality[StartIndex]=",TmpPriceInaquality[StartIndex]);       Print("Control1:tmp=",tmp);       TmpPriceInaquality[StartIndex]=TmpPriceInaquality[TmpMinIndex];       Print("Control1:TmpPriceInaquality[StartIndex]=",TmpPriceInaquality[StartIndex]);       TmpPriceInaquality[TmpMinIndex]=tmp;       Print("Control1:TmpPriceInaquality[TmpMinIndex]=",TmpPriceInaquality[TmpMinIndex]);       tmp=TmpPriceInaquality[EndIndex];       Print("Control2:TmpPriceInaquality[EndIndex]=",TmpPriceInaquality[EndIndex]);       Print("Control2:tmp=",tmp);       TmpPriceInaquality[EndIndex]=TmpPriceInaquality[TmpMaxIndex];       Print("Control2:TmpPriceInaquality[EndIndex]=",TmpPriceInaquality[EndIndex]);       TmpPriceInaquality[TmpMaxIndex]=tmp;       Print("Control2:TmpPriceInaquality[TmpMaxIndex]=",TmpPriceInaquality[TmpMaxIndex]);       Print("Control00:TmpPriceInaquality:");       for(int f=0;f<=LockIndex;f++)         {          Print(" ",TmpPriceInaquality[f]);         }       //переставляем на нужные места наибольшее и наименьшее найденные в проходе перебора массива TmpFirstOrderOpenPrice[] значения       tmp=TmpFirstOrderOpenPrice[StartIndex];       TmpFirstOrderOpenPrice[StartIndex]=TmpFirstOrderOpenPrice[TmpMinIndex];       TmpFirstOrderOpenPrice[TmpMinIndex]=tmp;       tmp=TmpFirstOrderOpenPrice[EndIndex];       TmpFirstOrderOpenPrice[EndIndex]=TmpFirstOrderOpenPrice[TmpMaxIndex];       TmpFirstOrderOpenPrice[TmpMaxIndex]=tmp;       //переставляем на нужные места наибольшее и наименьшее найденные в проходе перебора массива LockFirstTicket[] значения       tmp=LockFirstTicket[StartIndex];       LockFirstTicket[StartIndex]=LockFirstTicket[TmpMinIndex];       LockFirstTicket[TmpMinIndex]=tmp;       tmp=LockFirstTicket[EndIndex];       LockFirstTicket[EndIndex]=LockFirstTicket[TmpMaxIndex];       LockFirstTicket[TmpMaxIndex]=tmp;       //переставляем на нужные места наибольшее и наименьшее найденные в проходе перебора массива LockSecondTicket[] значения       tmp=LockSecondTicket[StartIndex];       LockSecondTicket[StartIndex]=LockSecondTicket[TmpMinIndex];       LockSecondTicket[TmpMinIndex]=tmp;

      tmp=LockSecondTicket[EndIndex];       LockSecondTicket[EndIndex]=LockSecondTicket[TmpMaxIndex];       LockSecondTicket[TmpMaxIndex]=tmp;       //сдвигаем границы на единицу       StartIndex++;       EndIndex--;       TmpMin=TmpPriceInaquality[StartIndex];       TmpMax=TmpPriceInaquality[EndIndex];      }    Print("TmpPriceInaquality:");    for(int f=0;f<=LockIndex;f++)      {       Print(" ",TmpPriceInaquality[f]);      }    Print("TmpFirstOrderOpenPrice:");    for(int f=0;f<=LockIndex;f++)      {       Print(" ",TmpFirstOrderOpenPrice[f]);      }    Print("LockFirstTicket:");    for(int f=0;f<=LockIndex;f++)      {       Print(" ",LockFirstTicket[f]);      }    Print("LockSecondTicket:");    for(int f=0;f<=LockIndex;f++)      {       Print(" ",LockSecondTicket[f]);      }   }

Sergey Gritsay
6582
Sergey Gritsay  
Посмотрите представленный класс в этой теме https://www.mql5.com/ru/forum/42036, может то что вам нужно, мне нужно было сортировать 4 массива по одному из них,  я немного его переделал и получил желаемое
alhimik7
124
alhimik7  
Спасибо!
Но хочется в своём коде разобраться, для повышения навыка, так сказать.
Ну если никто не поможет или не осилю, То буду разбираться по ссылке.
Vladimir Karputov
Модератор
52527
Vladimir Karputov  
alhimik7:
Здравствуйте! Который день бьюсь над реализацией сортировки массива. Помогите пожалуйста найти ошибку!!!
Алгоритм сортировки таков:
1. Перебираем все индексы массива, находим самое маленькое и самое большое значение, запоминаем индексы
2. в первый индекс ставим самое минимальное, в последний самое максимальное.
3 Следующий перебор начинаем не с первого а со второго, а заканчиваем не последним а предпоследним.
и. т.д

Код ниже:

ArraySort не пробовали применять? И ещё, код, пожалуйста, вставляйте в сообщение форума правильно: Правильно вставляем код на форуме
Alexandr Gavrilin
34112
Alexandr Gavrilin  

если ArraySort не поможет, то почитайте про самую простую сортировку пузырьковую) 

Dmitry Fedoseev
43762
Dmitry Fedoseev  
alhimik7:
Спасибо!
Но хочется в своём коде разобраться, для повышения навыка, так сказать.
Ну если никто не поможет или не осилю, То буду разбираться по ссылке.
Тогда хоть вставьте свой код через кнопку SRC.
Dmitry Fedoseev
43762
Dmitry Fedoseev  
У меня портянка кода на 4-ре экрана. Кто захочет о таком думать? Вот если не подсказать убрать пустые строки (по одной оставить), самостоятельно никак не догадаться?
Dmitry Fedoseev
43762
Dmitry Fedoseev  

Проще написать, чем разобраться, что де там такое...

void OnStart()
  {
//---

   double a[]={4,1,3,2,7,4,8,1,3,5,1,7,1,9,3};

   srt(a); // сортировка

   string str="";
   for(int i=0;i<ArraySize(a);i++){
      str+=a[i]+" ";
   }
   
   
   Alert(str);
   
   
}

void srt(double & a[]){ // функция сортировки

   double mxv, mnv, tmp;     
   int mxi, mni;

   int l=0;
   int r=ArraySize(a);
   int s=r/2;
   r--;
   
   for(;l<s;l++,r--){

      mxv=a[l];
      mxi=l;
      mnv=a[l];
      mni=l;
   
      for(int i=l+1;i<=r;i++){
         if(a[i]>mxv){
            mxv=a[i];
            mxi=i;
         }
         if(a[i]<mnv){
            mnv=a[i];
            mni=i;
         }
      }
      
      tmp=a[l];
      a[l]=a[mni];
      a[mni]=tmp;
      
      tmp=a[r];
      a[r]=a[mxi];
      a[mxi]=tmp;      
      
   }
   
}
alhimik7
124
alhimik7  

Готово!

Убрал пустые строки.

Taras Slobodyanik
15078
Taras Slobodyanik  
Для повышения навыка лучше ознакомиться с уже известными алгоритмами сортировки.
Для простых задач достаточно "Сортировки пузырьком".
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий