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

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

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

   >   >   > 


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

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

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

  Новости:
      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
       Все новости