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

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

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

   >   >   > 


Пример «Сортировка строк в двоичном дереве, доработка от ИИ Алиса»

Файлы:

  • Простые приложения
    • Сортировка строк в двоичном дереве, доработка от ИИ Алиса.пфл

Пример программы на языке программирования Перфолента.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

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

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

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