Язык программирования Перфолента.Net - Официальный сайт

 Язык программирования Перфолента.Net - Официальный сайт.

Поиск   
Главная :: О проекте :: Контакты :: Обратная связь :: Благодарности :: ВходГость

   >   >   > 


Пример «Сортировка массива в двоичном дереве оптимизирована ИИ 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

Перейти в раздел:
Примеры
  Поддержи проект!

Вы можете поддержать разработку Перфоленты, перечислив любую удобную сумму, которая пойдет на развитие языка и поддержку инфраструктуры сайта.

  Новости:
      21.01.2026 На сайт добавлена статья "Конструируем класс. События"
      20.01.2026 Опубликован новый релиз 0.4.18.0_NY языка программирования Перфолента.Net
      29.12.2025 Анонс: Новая возможность - разрабатываем веб-сайты, веб-приложения и веб-API на Перфоленте!
      07.06.2025 Небольшие дополнения к документации на сайте - описание атрибута поля &Атомарное
      09.05.2025 На сайте опубликован релиз 0.4.16.0_SE дистрибутива языка программирования Перфолента.Net
      27.04.2025 Дополнена статья про циклы
      04.01.2025 Опубликован новый релиз дистрибутива языка программирования Перфолента.Net версии 0.4.15.0_CE
      23.09.2024 Опубликована новая статья: "Конструируем класс. Делегаты."
      30.08.2024 Опубликован новый релиз дистрибутива языка программирования Перфолента.Net версии 0.4.14.0
      24.05.2024 Обновлён справочный раздел сайта
      01.07.2023 Новая версия 0.4.13.0 языка программирования Перфолента.Net
       Все новости