Пример работы функции 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: