Сортировка методом пузырька — это классический учебный алгоритм, который часто встречается в задачах для начинающих разработчиков. Несмотря на то что в реальной промышленной разработке на платформе 1С предпочтение отдается встроенным методам сортировки (которые работают значительно быстрее), понимание принципа работы "пузырька" помогает лучше разобраться в циклах, массивах и логике сравнения значений. В этой статье мы подробно разберем, как создать форму, настроить ввод чисел и реализовать сам алгоритм.
Для начала проанализируем задачу. Нам необходимо создать форму, на которой будут располагаться два поля ввода и кнопка. Рассмотрим процесс создания реквизитов:
Строка. Назовем их ИсходнаяСтрока и РезультатСортировки.ИсходнаяСтрока в свойствах можно установить маску (например, "99 99 99..."), однако маска жестко ограничивает количество вводимых символов. Если мы хотим вводить произвольное количество чисел через пробел, лучше оставить поле без маски, но добавить программную проверку на ввод только цифр и пробелов.ВыполнитьСортировку и выведем ее на командную панель или в виде кнопки на форму.Теперь реализуем сам алгоритм. Суть метода заключается в последовательном сравнении соседних элементов массива. Если левый элемент больше правого, они меняются местами. Рассмотрим программный код функции, которая принимает массив и возвращает его в отсортированном виде:
&НаСервереБезКонтекста
Функция СортировкаПузырьком(МассивДанных)
КоличествоЭлементов = МассивДанных.Количество();
// Внешний цикл проходит по всем элементам
Для i = 0 По КоличествоЭлементов - 1 Цикл
// Внутренний цикл сравнивает соседние пары
// С каждым проходом внешнего цикла самый "тяжелый" элемент
// "всплывает" в конец, поэтому мы уменьшаем границу поиска на i
Для j = 0 По КоличествоЭлементов - i - 2 Цикл
Если МассивДанных[j] > МассивДанных[j + 1] Тогда
// Меняем элементы местами через временную переменную
ВременнаяПеременная = МассивДанных[j];
МассивДанных[j] = МассивДанных[j + 1];
МассивДанных[j + 1] = ВременнаяПеременная;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Возврат МассивДанных;
КонецФункции
Обратите внимание на директиву &НаСервереБезКонтекста. Выполнение вычислительных задач на сервере — это хороший тон в 1С, так как серверные мощности обычно выше клиентских, а передача небольшого массива данных не создаст большой нагрузки на сеть.
Поскольку пользователь вводит данные в строку, нам необходимо преобразовать эту строку в массив чисел, вызвать нашу функцию и собрать результат обратно в строку для вывода на форму. Разберем по шагам обработчик команды кнопки:
&НаКлиенте
Процедура ВыполнитьСортировку(Команда)
// 1. Разбиваем строку в массив, используя пробел как разделитель
МассивСтрок = СтрРазделить(Объект.ИсходнаяСтрока, " ", Ложь);
// 2. Преобразуем строковые значения в числа
МассивЧисел = Новый Массив;
Для Каждого ТекСтрока Из МассивСтрок Цикл
// Проверяем, не пустая ли строка (если ввели лишние пробелы)
ТекЗначение = СокрЛП(ТекСтрока);
Если Не ПустаяСтрока(ТекЗначение) Тогда
// Обязательно используем типизацию Число()
МассивЧисел.Добавить(Число(ТекЗначение));
КонецЕсли;
КонецЦикла;
// 3. Вызываем функцию сортировки
ОтсортированныйМассив = СортировкаПузырьком(МассивЧисел);
// 4. Собираем массив обратно в строку для отображения
Объект.РезультатСортировки = СтрСоединить(ОтсортированныйМассив, ", ");
КонецПроцедуры
Проанализируем некоторые тонкости, которые могут встретиться при реализации. В 1С объекты типа Массив передаются по ссылке. Это означает, что если вы передадите массив в функцию, он изменится и в вызывающем коде. Если вам нужно сохранить исходный порядок в первоначальном массиве, внутри функции следует создать его копию.
Оптимизация алгоритма: Классический "пузырек" можно ускорить. Если во внутреннем цикле не произошло ни одного обмена, значит, массив уже отсортирован, и выполнение можно прервать. Рассмотрим модифицированный вариант:
&НаСервереБезКонтекста
Функция ОптимизированныйПузырек(Массив)
н = Массив.ВГраница();
Пока н > 0 Цикл
НоваяГраница = 0;
Для j = 0 По н - 1 Цикл
Если Массив[j] > Массив[j + 1] Тогда
Замена = Массив[j];
Массив[j] = Массив[j + 1];
Массив[j + 1] = Замена;
НоваяГраница = j;
КонецЕсли;
КонецЦикла;
н = НоваяГраница;
КонецЦикла;
Возврат Массив;
КонецФункции
Выясним, как решается эта задача в реальных проектах, если нет жесткого требования использовать учебный метод. Платформа 1С предоставляет мощные встроенные инструменты, написанные на языке C++, которые работают на порядки быстрее ручного перебора.
СписокЗначений имеет встроенный метод СортироватьПоЗначению(). Мы можем загрузить массив в список, вызвать одну команду и выгрузить обратно.Сортировать() у объекта ТаблицаЗначений позволяет сортировать данные по нескольким колонкам одновременно.УПОРЯДОЧИТЬ ПО языка запросов 1С.Пример использования СписокЗначений:
Функция СортировкаСписком(Массив)
Список = Новый СписокЗначений;
Список.ЗагрузитьЗначения(Массив);
Список.СортироватьПоЗначению(НаправлениеСортировки.Возр);
Возврат Список.ВыгрузитьЗначения();
КонецФункции
Подводя итог, отметим, что для учебных целей метод пузырька незаменим: он наглядно показывает работу индексов и логических условий. Однако для боевых задач всегда старайтесь использовать встроенные методы платформы 1С, такие как СписокЗначений или запросы.