Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.92/144: Рейтинг темы: голосов - 144, средняя оценка - 4.92
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
1

САМАЯ БЫСТРАЯ сортировка!

22.01.2010, 00:29. Показов 27596. Ответов 59
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Теоретически и практически доказано, что сортировка OVERPOWER8 - самая быстрая в мире.

Характеристика:
Требуется памяти: 3*N
Количество шагов в любом случае: 3*N
Стабильная: ДА
Метод: Замена

Если не верите, то можете проверить:

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
52
53
54
55
56
57
#include <iostream>
#include <stdlib.h>
using namespace std;
 
const int SIZE=2000000;
 
void sort(int arr[])
{
    int max=arr[0];
    
    int i;
    
    for(i=0; i<SIZE; i++)
        if(arr[i] > max)
            max = arr[i];
    
    int* Sorted = new int[max+1];
    
    for(i=0; i<SIZE; i++)
        Sorted[arr[i]]+=1;
    
    int counter=0;
    
    for(i=0; i<=max; i++)
        while(Sorted[i])
        {
            arr[counter++]=i;
            Sorted[i]--;
        }
        
    delete [] Sorted;
}
 
int main()
{
    srand(time(0));
 
    int Max=2000000;
    
    int i, j;
    
    int array[SIZE];
    
    for(i=0; i<SIZE; i++)
        array[i]=rand()%Max+1;
        
    sort(array);
    
    cout << "Sorted!\n";
    
    /*
    for(i=0; i<SIZE; i++)
        cout << array[i] << " ";
    */
    
    return 0;
}
P. S. при использовании элементов более 2000000, требуется использовать другой тип данных, например, uint64_t.

Не знаю, почему codepad.org выдает Segmentation Fault,
у меня на Linux G++ все работает замечательно.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.01.2010, 00:29
Ответы с готовыми решениями:

Самая быстрая сортировка
Какая на данный момент самая быстрая сортировка?

Какая библиотека самая быстрая для вычисления md5 и sha1?
Здравствуйте, подскажите пожалуйста, какая lib самая быстрая для вычислений md5 и sha1? использую...

Быстрая сортировка(сортировка Хоара). Отсортировать фрагмент массива
Мне нужно отсортировать фрагмент массива, расположенный между первым и последним отрицательным...

Быстрая сортировка (сортировка Хоара) для связных списков
есть у кого готовый алгоритм? или подскажите как реализовать

59
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
22.01.2010, 15:26 41
Author24 — интернет-сервис помощи студентам
вики
Алгоритмы сортировки, использующие только абстрактную операцию сравнения ключей всегда нуждаются по меньшей мере в O(n log n) сравнениях
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
22.01.2010, 15:28 42
OVERPOWER8:
Если ты гений помоги мне разобрать с библиотекой декодирования MPEG-2 видео.
0
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 15:31  [ТС] 43
>> zim22

А где вы увидели у меня "абстрактную операцию сравнения ключей"?
Такое впечатление, будто вы мой код даже не видели!

>> Genius Ignat

Нет, вот уж сам разбирайся.
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
22.01.2010, 15:34 44
OVERPOWER8:
Ты действительно хочешь мне помочь?
0
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 15:36  [ТС] 45
>> zim22

Ну так что? Теперь по другому смотрите на мою сортировку?
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
22.01.2010, 15:37 46
OVERPOWER8:
Я вспылил на счет MPEG-2.
Тебе лучше этого не видеть.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
22.01.2010, 16:29 47
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
А что не нравится?
По-моему тебе довольно внятно объяснили, что при сортировке маасива из двух элементов { 1, 1000000 } у тебя будет цикл на миллион итераций

Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Такое впечатление, будто вы мой код даже не видели!
Такое впечатление, что ты совершенно не читаешь, что тебе пишут
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
22.01.2010, 16:47 48
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
А где вы увидели у меня "абстрактную операцию сравнения ключей"?
на то она и астрактная операция, что под ней подразумевается любой способ, применив который, можно выяснить является ли один ключ меньше другого.
вот один раз увидел:
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
if(arr[i] > max)
max = arr[i];
а вот второй раз:
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
while(Sorted[i])
{
arr[counter++]=i;
Sorted[i]--;
}
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Ну так что? Теперь по другому смотрите на мою сортировку?
я на неё вообще никак не смотрю. это кривой велосипед. всё уже сделано до тебя. есть уйма сортировок для которых определены их характеристики. я уж лучше их буду использовать, чем твою
0
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 17:10  [ТС] 49
>> zim22

Ну как хотите.

А я уже составил алгоритм анализа, когда использовать мою сортировку:
1. Элементов больше, чем 10 000 000 (иначе ненамного быстрее, чем qsort)
2. все элементы >= 0
3. Макс. элемент такой, чтобы хватило памяти для динам. массива такого размера,
и желательно, чтобы он был меньше, чем N*log(N).

Иначе использовать STL -> qsort.

Вот несколько сравнительных запусков (показано время в с.):
STL -> qsort: 110 39 19 3 3
Power_sort: 44 16 7 8 3

Следствие: если элементов меньше, чем 10.000.000, то моя сортировка не особо выигрывает перед qsort. Однако памяти расходуется приблизительно одинакого.
0
Evg
Эксперт CАвтор FAQ
21279 / 8301 / 637
Регистрация: 30.03.2009
Сообщений: 22,659
Записей в блоге: 30
22.01.2010, 17:13 50
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
А я уже составил алгоритм анализа, когда использовать мою сортировку:
1. Элементов больше, чем 10 000 000 (иначе ненамного быстрее, чем qsort)
2. все элементы >= 0
3. Макс. элемент такой, чтобы хватило памяти для динам. массива такого размера,
и желательно, чтобы он был меньше, чем N*log(N).
А теперь придумай случай, где РЕАЛЬНО нужна сортировка с такими ограничениями?
0
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 17:40  [ТС] 51
>> Evg
А теперь придумай случай, где РЕАЛЬНО нужна сортировка с такими ограничениями?
Да полно, даже перечислять не стану!

Вы бы лучше посмотрели на время!
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
22.01.2010, 17:48 52
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Вы бы лучше посмотрели на время!
Что нам дает это время, если область применения этой сортировки очень и очень ограничена?
То что можно будет кому-нибудь пустить пыль в глаза?
Сортировка в таком виде никому не будет нужна.

Где мы будем эту сортировку использовать?
0
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 17:53  [ТС] 53
Имеется 400.000.000 человек с возрастами: 20 ... 70 лет.
Надо их отсортировать по возрастам.

Моя сортировка займет 10 секунд + 1 секунда - анализ.
STL -> qsort: 140 секунд. (т. е. более чем в 10! раз дольше!)
0
depict1
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
22.01.2010, 17:54 54
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Вы бы лучше посмотрели на время!
твоя сортировка сортирует всё-что угодно или только типы int?
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
STL -> qsort: 140 секунд.
так stl или qsort?
0
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 18:37  [ТС] 55
>> zim22

твоя сортировка сортирует всё-что угодно или только типы int?
Ну вообще-то может сортировать все что угодно - классы, структуры и т. д. Для этого надо дописать, чтобы создавал динамический массив определенных обэектов, и функцию, которая возвращает значение какого-либо члена объекта.

Можно, конечно, сделать, только пока что нет надобности и желания.

так stl или qsort?
Обобщенный алгоритм qsort из стандартной библиотеки stl (не знаю, как остальные, но я отношу cstdlib к stl)
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
22.01.2010, 18:39 56
Где мы будем эту сортировку использовать?
Вести перепись населения планеты: упорядочивать данные о людях всей планеты.
0
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 18:44  [ТС] 57
>> Genius Ignat

Пока что не сталкивался с необходимостью такой сортировки.
Но вот если столкнусь (ну не знаю, может быть! при программировании какой-нибудь игры)
Не надо будет ничего изобретать.
0
Эксперт С++
7175 / 3234 / 81
Регистрация: 17.06.2009
Сообщений: 14,164
22.01.2010, 21:11 58
Ввиду того что автор не может разобраться с работоспособностью собственного кода продолжение данной темы считаю бессмысленным.

Добавлено через 46 минут
Ввиду новых уточнений тему открываю.

Добавлено через 9 минут
Рекомендую ознакомиться с алгоритмом http://ru.wikipedia.org/wiki/Сортировка_подсчётом
Похоже это и есть алгоритм, который пытается изобрести OVERPOWER8
0
4337 / 1506 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
22.01.2010, 21:40 59
этот алгоритм уже давно придуман и называется он сортировка подсчетом
которая во-первых требует памяти O(MAX),
во-вторых нестабильна (ты хоть гуглил что значит устойчивая сортировка)
в-третьих она основана вовсе не на замене (капитан очевидность недоумевает, где там замена)

Что-то мне подсказывает ты проводил тесты на массивах типа
C#
1
2
Random rnd = new Random(DateTime.Now.Millisecond);
int[] msv = (new int[2000000]).Select(n => rnd.Next(0, 10)).ToArray();
А ты попробуй такой
C#
1
2
3
Random rnd = new Random(DateTime.Now.Millisecond);
int[] msv = (new int[2000000]).Select(n => rnd.Next(0, 10)).ToArray();
msv[4] = int.MaxValue;
или такой
C#
1
int[] msv = { 0, int.MaxValue };
Любой из алгоритмов быстрая/пирамидальная/слиянием или подобный будет гораздо быстрее, а т.к твоя реализация еще и криворукая ты получишь либо StackOverflow либо OutOfMemory

Даже хорошая реализация (которая стабильна) не делает эту сортировку достойной: она сортирует только дискретные величины

Не по теме:

Надеюсь код на c# тебе понятен



Добавлено через 4 минуты
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Ну вообще-то может сортировать все что угодно - классы, структуры и т. д.
2
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
22.01.2010, 22:10 60
Жестко
Так вроде тему закрывали.
0
22.01.2010, 22:10
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.01.2010, 22:10
Помогаю со студенческими работами здесь

Сортировка Слиянием vs Быстрая Сортировка - что лучше
Народ, помогите разобраться какой из методов сортировки лучше &quot;Сортировка Слиянием&quot; или &quot;Быстрая...

C/C++ FAQ :: Быстрая сортировка (сортировка Хоара)
Вопрос, скорее академический, по мотивам реализации. Вот в faq приведена реализация этого метода...

Быстрая сортировка (сортировка методом Хоара)
Ввести массив x1,x2,...,x20 в диапазоне . Требуется расположить отрицательные элементы в порядке...

Сортировка Хоара / Быстрая сортировка
Доброго времени суток. Написал реализацию алгоритма быстрой сортировки. void SortHhoar(int...


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

Или воспользуйтесь поиском по форуму:
60
Закрытая тема Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru