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

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

Код ниже:

 

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]);      }   }

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

Код ниже:

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

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

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

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

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;      
      
   }
   
}
 

Готово!

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

 
Для повышения навыка лучше ознакомиться с уже известными алгоритмами сортировки.
Для простых задач достаточно "Сортировки пузырьком".
Причина обращения: