Исходный код функции сортировки методом пузырька
В прошлом выпуске я рассказал о сортировке методом пузырька. В этом выпуске я приведу исходный код функции, которая сортирует массив таким методом.
//+---------------------------------------------------------------------------------------------------+
//| Функция 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: