Пример работы функции Sort() - сортировки методом пузырька
В прошлом выпуске я привел исходный код функции Sort() глобального массива, которая осуществляет сортировку методом пузырька.
На мой взгляд, подробно разбирать ее не имеет смысла, т.к. она содержит много комментариев. Проблема с пониманием может возникнуть только на этом участке кода:
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)
{
// произошла ошибка при изменении элемента
...
return(false);
}
if (GlobalVariableSet(array+DoubleToStr(i+1, 0),m1)==0)
{
// произошла ошибка при изменении элемента
...
return(false);
}
}
}
Понять, что же делает этот кусок кода будет полегче, если Вы еще раз прочитаете описание алгоритма сортировки методом пузырька. Для облегчения Вашей задачи я приведу пример.
Допустим, что у нас есть неотсортированный массив и мы хотим его отсортировать по убыванию.
| № элемента | Исходное состояние | После шага 1 | После шага 2 | После шага 3 | После шага 4 | После шага 5 | |||||||
| 6 | 89 | 2 | 2 | 2 | 2 | 2 | |||||||
| 5 | 2 | 89 | 7 | 7 | 7 | 7 | |||||||
| 4 | 45 | 7 | 89 | 8 | 8 | 8 | |||||||
| 3 | 7 | 45 | 8 | 89 | 24 | 24 | |||||||
| 2 | 8 | 8 | 45 | 24 | 89 | 45 | |||||||
| 1 | 24 | 24 | 24 | 45 | 45 | 89 |
Под "шагами" здесь понимается "внешний" цикл for (up_idx=count; up_idx>1; up_idx--).
Во внутреннем же цикле, например, на первом шаге мы осуществляем следующие действия:
- Сравниваем первый элемент (24) и второй (8). Т.к. они расположены по убыванию, то ничего с ними не делаем.
- Сравниваем второй элемент (8) и третий (7). Т.к. они расположены по убыванию, то ничего с ними не делаем.
- Сравниваем третий элемент (7) и четвертый (45). Т.к. они не расположены по убыванию, то поменяем их местами.
- Сравниваем новый четвертый элемент (7) и пятый (2). Т.к. они расположены по убыванию, то ничего с ними не делаем.
- Сравниваем пятый элемент (2) и шестой (89). Т.к. они расположены по убыванию, то ничего с ними не делаем.
- Сравниваем первый элемент (24) и второй (8). Т.к. они не расположены по убыванию, то поменяем их местами.
Результат первого шага изображен в таблице.
По аналогии мы проходим наш массив еще 4 раза (четыре шага) и получае массив, отсортированный по убыванию.
Все статьи по теме "Пишем советников для MetaTrader 4".
- Механическая торговая система - миф или реальность?
- С чего начать при написании советника:
- Создаем нового советника - Настраиваем параметры. - Язык MetaQuotes Language 4: