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