Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/55: Рейтинг темы: голосов - 55, средняя оценка - 4.87
What? Where? Why?
106 / 106 / 32
Регистрация: 16.10.2012
Сообщений: 459

Как работает Array.Sort

23.03.2013, 16:46. Показов 10871. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно вопрос в том, как всё-таки работает сортировка Array.Sort?
Этот вопрос возник потому, что после анализа время ее работы с другими сортировками (к примеру быстрой и Шелла) заметна победа Array.Sort причем с очень значительным отрывом.
Пробовал просматривать ее Deflector'ом, но как-то я запутался там. Может быть кто-то в более понятной форме может объяснить на каких алгоритмах она основана?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.03.2013, 16:46
Ответы с готовыми решениями:

Как пользоваться функцией Array.Sort() для сортировки по алфавиту
Всем привет обьясните пожалуйсто как пользоваться функцией Array.Sort(); для сортировке по алфавиту для коллекций....

Как сделать чтобы array.Sort сортировал в порядке увеличения модулей элементов
Как сделать чтобы array.Sort сортировал в порядке увеличения модулей элементов

Сортировка Array.Sort
Я новичок, поэтому объясните как можно более прозрачно. У меня есть массив, который сохраняет название хоккейных команд, в этом массиве...

4
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.03.2013, 17:02
Обычная быстрая сортировка, она же QuickSort.
0
What? Where? Why?
106 / 106 / 32
Регистрация: 16.10.2012
Сообщений: 459
23.03.2013, 20:41  [ТС]
Но тогда почему она работает быстрее, чем написанная мною быстрая сортировка?
Код быстрой сортировки
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public static long QuickSort(int[] array, int a, int b)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();
            int A = a;
            int B = b;
            double mid;
            if (b > a)
            {
                mid = array[(a + b) / 2];
                while (A <= B)
                {
                    while ((A < b) && (array[A] < mid)) ++A;
                    while ((B > a) && (array[B] > mid)) --B;
                    if (A <= B)
                    {
                        int T;
                        T = array[A];
                        array[A] = array[B];
                        array[B] = T;
 
                        ++A;
                        --B;
                    }
                }
                if (a < B) Sort.QuickSort(array, a, B);
                if (A < b) QuickSort(array, A, b);
 
            }
            sw.Stop();
            return sw.ElapsedTicks;

PS Во вложении график работы трех сортировок: синяя - Шелл, желтая - быстрая, серая - Array.Sort. (Сортировался файл с числами, по горизонтали - кол-во чисел, по вертикали - тики процессора. Перемешанность файла состовляла 50%)
Миниатюры
Как работает Array.Sort  
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
23.03.2013, 21:14
Стало интересно, глянул код.
Вот как происходит сортировка:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
private static void IntroSort(T[] keys, int lo, int hi, int depthLimit, IComparer<T> comparer)
{
    while (hi > lo)
    {
        int num = (hi - lo) + 1;
        if (num <= 0x10)
        {
            switch (num)
            {
                case 1:
                    return;
 
                case 2:
                    ArraySortHelper<T>.SwapIfGreater(keys, comparer, lo, hi);
                    return;
 
                case 3:
                    ArraySortHelper<T>.SwapIfGreater(keys, comparer, lo, hi - 1);
                    ArraySortHelper<T>.SwapIfGreater(keys, comparer, lo, hi);
                    ArraySortHelper<T>.SwapIfGreater(keys, comparer, hi - 1, hi);
                    return;
            }
            ArraySortHelper<T>.InsertionSort(keys, lo, hi, comparer);
            return;
        }
        if (depthLimit == 0)
        {
            ArraySortHelper<T>.Heapsort(keys, lo, hi, comparer);
            return;
        }
        depthLimit--;
        int num2 = ArraySortHelper<T>.PickPivotAndPartition(keys, lo, hi, comparer);
        ArraySortHelper<T>.IntroSort(keys, num2 + 1, hi, depthLimit, comparer);
        hi = num2 - 1;
    }
}
Интересная реализация, используется комбинация из простого свопа, сортировки вставкой и сортировки кучей, в зависимости от количества элементов подмножества.
2
What? Where? Why?
106 / 106 / 32
Регистрация: 16.10.2012
Сообщений: 459
23.03.2013, 22:17  [ТС]
Ох уж эта магия .Net'a
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.03.2013, 22:17
Помогаю со студенческими работами здесь

Разобрать пример с Array.Sort()
Здравствуйте! не могу понять как так получается что строка sr1.Sort(ref db_arr); возвращает отсортированный массив db_arr... почему так?...

Сортировка функцией Array.Sort
Даже числа не выводит,чес слово. Что исправить? static void Main(string args) { int n; ...

Array.Sort не сортирует одномерный массив
Добрый день! Подскажите, пожалуйста, что не так с кодом? Задача: В одномерном массиве, состоящем из n вещественных элементов, вычислить: ...

Что происходит при Array.Sort
помогите описать строчку там два метода т.е. что там происходит Array.Sort(s, (p1, p) =&gt; p1.Mark.CompareTo(p.Mark));//метод...

Работа с String и Array.Sort, задачка
Всем привет, помогите в решении пожалуйста: Нужно сделать через массив String, отсортировать его при помощи Array.Sort, где в начале...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru