Исходный код функции сортировки методом пузырька
В прошлом выпуске я рассказал о сортировке методом пузырька. В этом выпуске я приведу исходный код функции, которая сортирует массив таким методом.
//+---------------------------------------------------------------------------------------------------+ //| Функция Sort() - сортирует массив методом пузырька | //| | //| Возвращает true, если не было ошибки, и false, если ошибка была | //| | //| Параметры: | //| array - имя массива | //| is_asc_order - если true, то сортируется по возрастанию; если | //| false, то по убыванию | //+--------------------------------------------------------------------------------------------------+ bool Sort(string array, bool is_asc_order) { // Залокируем критическую секцию string critical_section = array+"Lock"; if (Lock(critical_section)!=0) return(false);
// Количество элементов массива хранится в переменной с именем, // равным имя массива + "Count" string gv_count; gv_count = array+"Count";
int count, err;
// Если глобальная переменная не существует, то элементов нет if (!GlobalVariableCheck(gv_count)) { err = GetLastError(); if (err!=0) { // Разлокировать критическую секцию Unlock(critical_section);
// Вывести сообщение об ошибке и выйти Print("Sort()->GlobalVariableCheck(): ошибка ", err); return(false); } else count = 0; } else // переменная существует, получим количество элементов count = GlobalVariableGet(gv_count);
int i, up_idx;
for (up_idx=count; up_idx>1; up_idx--) { // обработаем участок массива 1..up_idx for (i=1; i<up_idx; i++) { // m1 - элемент i // m2 - элемент i+1 double m1 = GlobalVariableGet(array+DoubleToStr(i, 0)); double m2 = GlobalVariableGet(array+DoubleToStr(i+1, 0));
bool is_sorted; // если true, то не надо переставлять элементы is_sorted = true;
if (is_asc_order) { // сортируем по возрастанию if (m1>m2) is_sorted = false; } else { // сортируем по убыванию if (m1<m2) is_sorted = false; }
// переставим элементы местами if (is_sorted) continue; if (GlobalVariableSet(array+DoubleToStr(i, 0),m2)==0) { // произошла ошибка при изменении элемента
// Разлокировать критическую секцию Unlock(critical_section);
// Вывести сообщение об ошибке и выйти Print("Sort()->GlobalVariableSet(): ошибка ", GetLastError()); return(false); } if (GlobalVariableSet(array+DoubleToStr(i+1, 0),m1)==0) { // произошла ошибка при изменении элемента
// Разлокировать критическую секцию Unlock(critical_section);
// Вывести сообщение об ошибке и выйти Print("Sort()->GlobalVariableSet(): ошибка ", GetLastError()); return(false); } } } // Разлокировать критическую секцию Unlock(critical_section);
return(true); }
В следующем выпуске я покажу на примере, как работает эта функция.
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4: