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

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

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

Студворк — интернет-сервис помощи студентам
Теоретически и практически доказано, что сортировка 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.01.2010, 00:29
Ответы с готовыми решениями:

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

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

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

59
MCSD: APP BUILDER
 Аватар для IT_Exp
8795 / 1074 / 104
Регистрация: 17.06.2006
Сообщений: 32,602
22.01.2010, 00:36
OVERPOWER8,

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

думаю, теперь пора подавать заявку в книгу рекордов Гиннеса, а также в Нобелевский комитет.
только про кодепад им не говори.
0
 Аватар для OVERPOWER8
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 00:41  [ТС]
>> Rififi

Можешь выяснить, почему некоторые компиляторы выдают Segmentation Fault
А то я не вижу ни одной ошибки, и G++ ничего не говорит.
0
 Аватар для Gravity
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
22.01.2010, 00:43
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
int* Sorted = new int[max+1];
Ты выделяешь новый массив размером равным максимальному значению сортируемого массива. Но чего будем делать, если придется сортировать структуры или другие комплексные типы данных?
0
 Аватар для OVERPOWER8
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 00:45  [ТС]
>>Gravity

Но чего будем делать, если придется сортировать структуры или другие комплексные типы данных?
Придумаю что-нибудь, если надо будет.
Ты вот лучше подскажи, почему codepad выдает Segmentation Fault
И мой компилятор при использовании более 3000000 элементов - тоже Segmentation Fault
Блин, никак не вижу ошибку.
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
22.01.2010, 00:53
У меня и вовсе это вываливается в "Необработанное исключение в "0x00401c77" в "AB.exe": 0xC00000FD: Stack overflow." в файле "chkstk.asm - C stack checking routine". Ведь массив передается как копия.
При SIZE = 1 вообще виснет
При SIZE > 1 : ~ "Необработанное исключение в "0x7c92aa8c" в "AB.exe": 0xC0000005: Нарушение прав доступа при записи "0x00030fec"."
Все в VS 2008
0
 Аватар для OVERPOWER8
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 00:57  [ТС]
insideone

А как насчет:
void sort(int* arr)

Однако это не решает проблему с codepad
0
Автор FAQ
 Аватар для insideone
3687 / 964 / 114
Регистрация: 10.01.2010
Сообщений: 2,550
22.01.2010, 01:00
Вы пишите программы для codepad или для чего?) Разве это важный фактор? -)

Тэкс... что бы я не делал с SIZE код не работает. При "void sort(int* arr)" тоже не работает. Во как!

C++
1
2
3
4
5
        for(i=0; i<SIZE; i++)
                if(arr[i] > max)
                        max = arr[i];
        
        int* Sorted = new int[max+1];
При пошаговом выполнении обнаружил что компилятор посчитал что "int* Sorted = new int[max+1];" расположена внутри тела цикла. По крайне мере это так выглядит. VS 2008 сошла с ума? =)
Однако любые исправления не привели к работоспособности. Гмгм
0
 Аватар для OVERPOWER8
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 01:08  [ТС]
>> insideone

Вообще-то это важно. Хотелось бы чтобы мой код работал исправно на всех компиляторах, а не тоьлко на G++.

Есть простое решение - создать 2 глобальных массива. Тогда будет всегда работать исправно.
Только встает одна проблема - как быть с размерами?

При пошаговом выполнении обнаружил что компилятор посчитал что "int* Sorted = new int[max+1];" расположена внутри тела цикла.

Это как же так? В таком случае надо отсоединить тело цикла скобками { }
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
22.01.2010, 01:42
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Требуется памяти: 3*N
Массив из двух элементов: 1, 1999999.
Максимальный элемент: 1999999.

C++
1
int* Sorted = new int[max+1]; // в данном случае max == 1999999
При выполнении этой строки выделится память размером 2000000 * sizeof(int), т.е. в МИЛЛИОН раз больше чем размер массива для сортировки в памяти.

Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Количество шагов в любом случае: 3*N
Даже не берусь подсчитать порядок количества шагов в твоем алгоритме для приведенного примера.
0
 Аватар для OVERPOWER8
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 01:46  [ТС]
>> CyBOSSeR

Да, все правильно. Этот вариант не подходит для сортировки маленьких массивов. А вот больших - очень даже.

МОЖЕТ КТО-ТО ОБЪЯСНИТЬ, ЧТО В КОДЕ НЕ ЧИСТО!?
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
22.01.2010, 01:52
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Этот вариант не подходит для сортировки маленьких массивов. А вот больших - очень даже.
Как и для сортировки массивов, в которых, есть хотя бы один отрицательный элемент.
Упадем здесь либо здесь:
C++
1
int* Sorted = new int[max+1];
либо здесь:
C++
1
Sorted[arr[i]]+=1;
0
 Аватар для OVERPOWER8
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 02:07  [ТС]
>> CyBOSSeR

Упадем здесь:
C++
1
int* Sorted = new int[max+1];
либо здесь:
C++
1
Sorted[arr[i]]+=1;
А что тут не правильно?

Если не сложно, то предложите ваш вариант программы.

P.S. На этот раз решил обойтись без указателей.
1
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
22.01.2010, 02:16
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
А что тут не правильно?
Если у нас массив состоит только из отрицательных элементов, то и максимальный элемент будут отрицательным. Поэтому в этой строке
C++
1
int* Sorted = new int[max+1];
max+1 будет меньше или равно нулю - падаем по попытке выделить память отрицательного размера.

Если в массиве есть отрицательные элементы, то в этой строке
C++
1
Sorted[arr[i]]+=1;
рано или поздно arr[i] станет меньше нуля - падаем по выходу за пределы массива.
0
 Аватар для OVERPOWER8
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 02:21  [ТС]
>> CyBOSSeR

Да ладно вам с отрицательными элементами!
Я попросил проверить тот код, который я предложил изначально - там что-то не правильно.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
22.01.2010, 02:24
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
На этот раз решил обойтись без указателей.
Главное палку не перегибай в этом вопросе.

OVERPOWER8, в том то и дело, очень много мест, где можно упасть, потому что алгоритм положенный в основу этого кода никуда не годится.
Кстати на словах опиши его.
0
 Аватар для OVERPOWER8
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 02:29  [ТС]
>> CyBOSSeR

А зачем на словах описывать? Я его в коде описал. И, честно говоря, не вижу ни одной причины, почему некоторые компиляторы ругаются (В данном примере).

>> CyBOSSeR

Может быть, вы объясните, почему некоторым компиляторам не нравится конкретно мой код (а не алгоритм)?

А насчет отрицательных чисел - очень просто - создам новый массив из (-1*min)+1 элементов, отсортирую их в порядке убывания, и потом объединю оба массива.

И на мой взгляд этот алгоритм идеальный - и прост в реализации и быстрый, но вот только для определенных случаев.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
22.01.2010, 02:41
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Может быть, вы объясните, почему некоторым компиляторам не нравится конкретно мой код (а не алгоритм)?
Компилятора под рукой нет. Но могу по ошибкам подсказать.
Segmentation Fault говорит о попытки обращения к защищенным участкам памяти. Скорее всего где-то произошел выход за пределы массива.
Возможное решение: трассировать и проверять индексы.

Stack overflow говорит о переполнении стека. Размер стека ограничен (в зависимости от платформы). Это ошибка скорее всего связана с этой строкой:
C++
1
int array[SIZE];
При огромных значениях SIZE массив array просто не "влезает" в стек.
Возможное решение: выделять память в куче.

Вот как то так.
0
 Аватар для OVERPOWER8
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 02:43  [ТС]
>> CyBOSSeR

Странно. С помощью STL -> qsort я сортировал этот же массив, только SIZE был в разы больше - порядка 20 000 000, и все работало нормально. Подозреваю, что проблема в чем-то другом.

С индексами все путем. Проблема в чем-то другом...
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
22.01.2010, 02:46
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
>> CyBOSSeR

Странно. С помощью STL -> qsort я сортировал этот же массив, только SIZE был в разы больше - порядка 20 000 000, и все работало нормально. Подозреваю, что проблема в чем-то другом.
Не ты писал про переполнение стека, а кто-то другой. Как я уже говорил размер стека может варьироваться в зависимости от платформы, настроек проекта и т.д.
Возможно у тебя размер стека больше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.01.2010, 02:46
Помогаю со студенческими работами здесь

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

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

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

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

Сортировка Хоара / Быстрая сортировка
Доброго времени суток. Написал реализацию алгоритма быстрой сортировки. void SortHhoar(int *arr,int f,int l)//Хоара { int mid = (f...


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

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru