Использует ли метод Sort() в C# рекурсию?

Недавно я прочитал, что C# использует алгоритм быстрой сортировки для сортировки массива. Что я хотел бы знать, использует ли С# рекурсивный или итеративный подход?

Я нашел эту ссылку, и мне кажется, что они используют итеративный подход. Мне просто интересно, правда ли, что C# использует итеративную реализацию алгоритма QuickSort?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Две вещи:

  1. C# перешел от QuickSort к IntrospectiveSort, как показывает ваша ссылка. Вы можете увидеть комментарии и поддержку совместимости в исходном коде Sort.

  2. Код, на который вы ссылаетесь, является рекурсивным. В конце цикла происходит рекурсивный вызов:

    private void IntroSort(int lo, int hi, int depthLimit)
    {
        while (hi > lo)
        {
            int partitionSize = hi - lo + 1;
            if (partitionSize <= IntrospectiveSortUtilities.IntrosortSizeThreshold)
            {
                // ... 
                InsertionSort(lo, hi);
                return;
            }
            // ...
            int p = PickPivotAndPartition(lo, hi);
            IntroSort(p + 1, hi, depthLimit); // <--- recursive call
            hi = p - 1;
        }
    }
    

    Следующая итерация цикла берет левый раздел, а рекурсивный вызов — правый раздел.

Рекурсивный вызов правого раздела происходит перед обратным циклом для обработки левого раздела.

rcgldr 31.03.2024 16:23

Спасибо за ваш ответ! Мне просто интересно, почему они используют рекурсивный подход? Я спрашиваю, потому что часто слышал и слушал, что рекурсия менее производительна, чем итеративный подход.

Learner 31.03.2024 16:34

Рекурсия - это итерация, в любом случае это рекурсия..?

flackoverstow 31.03.2024 22:49

Извините, @flackoverstow, я не понимаю, что вы хотите сказать.

trincot 31.03.2024 22:57

Мне следовало бы использовать @Learner - это было скорее ответом на их вопросы о производительности и т. д., рекурсия в любом случае является формой итерации; в итерации у вас есть тело цикла с управляющей переменной, в рекурсии у вас есть тело метода с управляющей переменной - по сути, они ничем не отличаются.

flackoverstow 01.04.2024 06:51

@flackoverstow, чтобы превратить эту рекурсию в просто итерацию, вам понадобится нечто большее, чем управляющая переменная: вам понадобится стек, чтобы отслеживать предыдущие состояния (включая состояние цикла, который уже там находится).

trincot 01.04.2024 08:12

Возможно, это поможет объяснить мою точку зрения: итеративный подход с использованием стека и рекурсивный подход с использованием стека по сути ничем не отличаются. Таким образом, производительность, по сути, не будет отличаться; мы не обнаружим, что Sort() ускорился в 10 раз за счет отказа от используемого рекурсивного подхода

flackoverstow 01.04.2024 08:40

Другие вопросы по теме