Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
.NET 4.x

Быстрая сортировка (быстрее, чем Array.Sort)

24.09.2018, 03:20. Показов 1182. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть ли более быстрая сортировка string массива, чем Array.Sort?

C#
1
2
3
var sw = Stopwatch.StartNew();
            Array.Sort(contents);
            sw.Stop();
массив с 1 млн записей сортирует 00:00:04.3300746
массив с 5 млн записей сортирует 00:00:26.2569085

Это довольно долго, есть бы более быстрые алгоритмы?

Добавлено через 26 минут
Может быть использовать параллельную сортировку? Делаю внешнию сортировку и узкое место это сортировка разбитых файлов, 30 млн записей(500мб) сортирует около 120сек +-10, зависит на сколько файлов разбивать исходный файл. Я в интернете нашел какую-то программу на net(увы накрыта протектором исходники не посмотреть), она сортирует большие файлы и удаляет повторы за 25сек, поэтому наверное есть методы более быстро сортировать файлы. Буду признателен, если кто-то откликнется
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.09.2018, 03:20
Ответы с готовыми решениями:

Array.IndexOf(Array, Object, Int32) не получаю исключение, если startIndex = array.Length
Может гоню уже на старости лет... Array.IndexOf(Array, Object, Int32) Пример: int...

Сортировка массива структур с помощью Array.Sort
struct myArray { public int Numb; } class Program { static...

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

6
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
24.09.2018, 21:13
Можно попробовать quick sort используя параллельные вычисления
https://spacecoding.wordpress.... rallelism/
он, кстати, и используется в array.sort для больших массивов данных.

https://docs.microsoft.com/en-... tem_Array_

This method uses the introspective sort (introsort) algorithm as follows:

If the partition size is fewer than 16 elements, it uses an insertion sort algorithm.

If the number of partitions exceeds 2 * LogN, where N is the range of the input array, it uses a Heapsort algorithm.

Otherwise, it uses a Quicksort algorithm.
1
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
25.09.2018, 13:09  [ТС]
kenny69, нашел в интернете вот такой метод.
Вот тесты для 5 млн записей.
00:00:15.6066390
00:00:26.3419427
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 var f = File.ReadAllLines("temp/split00001.dat");
            var f2 = File.ReadAllLines("temp/split00001.dat");
 
            var sw = Stopwatch.StartNew();
            HeapSort.Sort(f,0,f.Length, (x, y) => string.Compare(x, y, StringComparison.Ordinal));
            sw.Stop();
            Console.WriteLine(sw.Elapsed);
           
            sw.Restart();
 
            Array.Sort(f2);
            sw.Stop();
            Console.WriteLine(sw.Elapsed);
 
            File.WriteAllLines("f.txt", f);
            File.WriteAllLines("f2.txt", f2);
            Console.ReadLine();
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
internal static class HeapSort
    {
        internal static void Sort<T>(T[] array, int offset, int length, Comparison<T> comparison)
        {
            if (array == null)
                throw new ArgumentNullException("array");
            if (offset < 0 || length < 0)
                throw new ArgumentOutOfRangeException((length < 0 ? "length" : "offset"), "Non-negative number required.");
            if (array.Length - offset < length)
                throw new ArgumentException("Offset and length were out of bounds for the array or count is greater than the number of elements from index to the end of the source collection.");
            if (comparison == null)
                throw new ArgumentNullException("comparison");
            for (var i = 0; i < length; i++)
            {
                var index = i;
                var item = array[offset + i];
                while (index > 0 && comparison(array[offset + (index - 1) / 2], item) < 0)
                {
                    var top = (index - 1) / 2;
                    array[offset + index] = array[offset + top];
                    index = top;
                }
                array[offset + index] = item;
            }
            for (var i = length - 1; i > 0; i--)
            {
                var last = array[offset + i];
                array[offset + i] = array[offset];
                var index = 0;
                while (index * 2 + 1 < i)
                {
                    int left = index * 2 + 1, right = left + 1;
                    if (right < i && comparison(array[offset + left], array[offset + right]) < 0)
                    {
                        if (comparison(last, array[offset + right]) > 0)
                            break;
                        array[offset + index] = array[offset + right];
                        index = right;
                    }
                    else
                    {
                        if (comparison(last, array[offset + left]) > 0)
                            break;
                        array[offset + index] = array[offset + left];
                        index = left;
                    }
                }
                array[offset + index] = last;
            }
        }
    }
P.s кстати разнятся результаты, при HeapSort сначало идут слова с тире, потом с точкой. При Array.Sort наоборот, почему так?
0
burning1ife
 Аватар для kenny69
1466 / 1287 / 294
Регистрация: 21.09.2008
Сообщений: 3,438
Записей в блоге: 9
25.09.2018, 18:15
Цитата Сообщение от Defences Посмотреть сообщение
HeapSort сначало идут слова с тире, потом с точкой. При Array.Sort наоборот, почему так?
Я думаю дело в Comparer, который непосредственно занимается определением какой элемент идет выше, ниже:
C#
1
string.Compare(x, y, StringComparison.Ordinal)
1
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
25.09.2018, 21:53
Все тесты я надеюсь запускаете в Release конфигурации и без отладчика ?
Цитата Сообщение от Defences Посмотреть сообщение
Я в интернете нашел какую-то программу на net(увы накрыта протектором исходники не посмотреть), она сортирует большие файлы и удаляет повторы за 25сек
Ссылку можно (или название)? Программа работает быстро с тем же набором данных (файлом) или "похожим, но другим"?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
26.09.2018, 14:17
Цитата Сообщение от Defences Посмотреть сообщение
есть бы более быстрые алгоритмы
Попробуйте TimSort.
И кстати, если вам нужно просто удалить повторы, то для этого сортировать массив не обязательно.
1
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
26.09.2018, 23:29  [ТС]
Storm23, спасибо. Просто задание с использованием внешней сортировки. Большое спасибо форуму, собрал различные методы сортировки, буду тестировать, пока что лидирует параллельная, раза в 3-4 быстрей обычного Array.Sort()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.09.2018, 23:29
Помогаю со студенческими работами здесь

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

Сортировка Array.Sort() с компаратором
struct Entrant { public string Name;//имя public int IdNum;//идентиф. код ...

Консольное приложение выполняет обработку ArrayList быстрее (причем гораздо быстрее), когда является не активным
Помогите разобраться. Как такое возможно, что консольное приложение выполняет обработку ArrayList...

Array.Sort() Какие параметры передать в этот метод?
Array.Sort(); Какие параметры передать в этод метод, чтобы масив отсортироватся не по возрозтанию,...

Метод, который сортирует и печатает массив по длине строчки, без использования готовой функции Array.Sort
с готовой функцией как то проще а как можно реализовать без Array.Sort и Compare например дан...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru