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