Пример «Сортировка строк в двоичном дереве, доработка от ИИ Алиса»
Файлы:
- Простые приложения
- Сортировка строк в двоичном дереве, доработка от ИИ Алиса.пфл
Пример программы на языке программирования Перфолента.Net:
//Эта программа написана на языке программирования Перфолента.Net.
//Программа демонстрирует алгоритм сортировки строк в двоичном дереве.
//Автор: Рогаткин Сергей Анатольевич, 2026
//Пример написан с помощью ИИ DeepSeek для целых чисел,
//затем оптимизирован с помощью ИИ Kimi,
//затем ИИ Алиса переделала его для строк!
#ТипСборки КонсольноеПриложение
#ИспользоватьСтандартнуюБиблиотеку
ИмпортИмён Промкод.Перфолента.Консоль
Программа СортировкаСтрокВДвоичномДереве
// Класс узла дерева для строк
&ВидноВсем
Класс УзелДерева
&ВидноВсем
Поле Значение тип Строка
&ВидноВсем
Поле Левый тип УзелДерева = Неопределено
&ВидноВсем
Поле Правый тип УзелДерева = Неопределено
&ВидноВсем
Конструктор(зн тип Строка)
Значение = зн
КонецКонструктора
КонецКласса
// Добавление строки в дерево
&ВидноВсем
Процедура ДобавитьУзел(Корень тип УзелДерева, НовоеЗначение тип Строка)
Если НовоеЗначение < Корень.Значение Тогда // Лексикографическое сравнение
Если Корень.Левый Определено Тогда
ДобавитьУзел(Корень.Левый, НовоеЗначение)
Иначе
Корень.Левый = Новый УзелДерева(НовоеЗначение)
КонецЕсли
Иначе
Если Корень.Правый Определено Тогда
ДобавитьУзел(Корень.Правый, НовоеЗначение)
Иначе
Корень.Правый = Новый УзелДерева(НовоеЗначение)
КонецЕсли
КонецЕсли
КонецПроцедуры
// Симметричный обход дерева (in?order) для сбора отсортированных строк
&ВидноВсем
Процедура ОбойтиДерево(Узел тип УзелДерева, Результат тип Массив<Строка>)
Если Узел.Левый Определено Тогда
ОбойтиДерево(Узел.Левый, Результат)
КонецЕсли
Результат.Добавить(Узел.Значение)
Если Узел.Правый Определено Тогда
ОбойтиДерево(Узел.Правый, Результат)
КонецЕсли
КонецПроцедуры
// Основная функция сортировки массива строк
&ВидноВсем
Функция СортировкаДеревом(Мас тип Строка[]) тип Строка[]
Если Мас.Количество() = 0 Тогда
Возврат Новый Строка[-1]
КонецЕсли
// Создаём корень из первого элемента
Перем Корень тип УзелДерева = Новый УзелДерева(Мас[0])
// Добавляем остальные строки
Для Инд = 1 По Мас.Количество() - 1 Цикл
ДобавитьУзел(Корень, Мас[Инд])
КонецЦикла
// Собираем результат
Перем Результат тип Массив<Строка> = Новый Массив<Строка>()
ОбойтиДерево(Корень, Результат)
Возврат Результат.ВМассив()
КонецФункции
// Тестовая функция
Функция Старт() тип Целое
ВыводСтроки("Тест сортировки строк двоичным деревом (Tree Sort)")
ВыводСтроки("=============================================")
// Тестовый массив строк
Перем ТестовыйМассив тип Строка[] = {"яблоко", "груша", "апельсин", "банан", "манго", "вишня", "ананас"}
ВыводСтроки("Исходный массив:")
Для Каждого Элемент Из ТестовыйМассив
Вывод(Элемент + " ")
КонецЦикла
ВыводСтроки("")
Перем Отсортированный тип Строка[] = СортировкаДеревом(ТестовыйМассив)
ВыводСтроки("Отсортированный массив:")
Для Каждого Элемент Из Отсортированный
Вывод(Элемент + " ")
КонецЦикла
ВыводСтроки("")
// Тест с большим массивом строк
Перем КвоЭлементов тип Целое = 1000
ВыводСтроки("")
ВыводСтроки("Тест с " + КвоЭлементов + " строками:")
Перем БольшойМассив тип Строка[] = Новый Строка[КвоЭлементов]
// Заполняем случайными строками (имитация)
Для Инд = 0 По КвоЭлементов - 1 Цикл
БольшойМассив[Инд] = "Элемент_" + ГСЧ.СлучайноеЦелое(100, 999)
КонецЦикла
// Выводим первые и последние 5 элементов до сортировки
ВыводСтроки("--- Перед сортировкой ---")
ВыводСтроки("Первые 5 элементов: " + СтрСоединить(СрезМассива(БольшойМассив, 0, 4, 1), ", "))
ВыводСтроки("Последние 5 элементов: " + СтрСоединить(СрезМассива(БольшойМассив, КвоЭлементов-5, КвоЭлементов-1, 1), ", "))
Перем ВремяНачала тип Число = ТекущаяУниверсальнаяДатаВМиллисекундах()
Перем БольшойРезультат тип Строка[] = СортировкаДеревом(БольшойМассив)
Перем ВремяЗатрачено тип Число = (ТекущаяУниверсальнаяДатаВМиллисекундах() - ВремяНачала) / 1000
ВыводСтроки("Время сортировки: " + ВремяЗатрачено + " сек")
ВыводСтроки("Количество: " + БольшойРезультат.Количество())
// Проверка корректности (лексикографический порядок)
Перем Корректно тип Булево = Истина
Для Инд = 1 По БольшойРезультат.Количество() - 1 Цикл
Если БольшойРезультат[Инд] < БольшойРезультат[Инд - 1] Тогда
Корректно = Ложь
Прервать
КонецЕсли
КонецЦикла
Если Корректно Тогда
ВыводСтроки("Сортировка выполнена корректно!")
Иначе
ВыводСтроки("Ошибка в сортировке!")
КонецЕсли
// Выводим первые и последние 5 элементов после сортировки
ВыводСтроки("--- После сортировки ---")
ВыводСтроки("Первые 5 элементов: " + СтрСоединить(СрезМассива(БольшойРезультат, 0, 4, 1), ", "))
ВыводСтроки("Последние 5 элементов: " + СтрСоединить(СрезМассива(БольшойРезультат, КвоЭлементов-5, КвоЭлементов-1, 1), ", "))
ВыводСтроки("")
Вывод("Нажмите Enter для выхода...")
ВводСтроки
Возврат 0
КонецФункции
КонецПрограммы
К началу статьи
Вернуться в раздел:
Примеры по языку Перфолента.Net
Перейти в раздел:
Примеры