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

Как исправить данный код сортировки?

22.01.2010, 12:25. Показов 1171. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вот только не надо никаких анализов, вопросов, и т. д.
Конкретно мой пример.

Программа на некоторых компиляторах не компилируется. Причем проблема вовсе не в переполнении стека - присвойте SIZE любое другое значение.
Если знаете, как исправить, то, пожалуйста, предложите свое решение.

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;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.01.2010, 12:25
Ответы с готовыми решениями:

Исправить код сортировки массива
Добрый вечер) Обращаюсь к вам за помощью. Есть программа, которая должна сортировать массив, а также выводить соответствующие данные из...

Исправить код сортировки выбором
Реализуйте алгоритм на языке Си, добавив в программу подсчет количества сравнений и перестановок, проведенных алгоритмом. Выполните...

Исправить код, реализующий алгоритм сортировки
Доброе утро. Сделал попытку реализовать функцию сортировки простым двухпутевым слиянием, но не вышло. При запуске происходит ошибка,...

8
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
22.01.2010, 12:58
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
int array[SIZE];
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
const int SIZE=2000000;
как-то неправильно на стеке создавать такую громадину.
лучше динамическую память используй ну или std::vector
1
 Аватар для OVERPOWER8
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 13:38  [ТС]
>> zim22

Спасибо, использование динамического массива исправило некоторые проблемы.
Если не сложно, то проверьте этот код на вашем компиляторе. А то мой G++ компилирует, и потом работает; а codepad.org выдает segmentation fault.

И почему-то мой компилятор при использовании элементов больше 1 000 000 000 тоже пишет ахинею какую-то:
Bash
1
2
3
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted
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
58
59
60
#include <iostream>
#include <stdlib.h>
#include <limits>
using namespace std;
 
const int SIZE=100000000;
 
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 = new int[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] << " ";
        */
        
        delete [] array;
 
        return 0;
}
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
22.01.2010, 13:42
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
Если не сложно, то проверьте этот код на вашем компиляторе.
не вижу смысла проверять. код глючный и может работать на одном наборе данных и крэшиться на другом. напиши для него юнит-тесты.

Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
const int SIZE=100000000;
int i;
for(i=0; i<SIZE; i++)
для индексации массивов используй тип size_t вместо int. а то в int может не влезть такое гигантское значение.
***
в прочем, как и в size_t
0
 Аватар для OVERPOWER8
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 14:26  [ТС]
>> zim22

Это почему же код глючный? У меня работает исправно.
Не вижу смысла использовать size_t, т. к:

numeric_limits<size_t>::max() = numeric_limits<unsigned int>::max();
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
22.01.2010, 14:35
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
И почему-то мой компилятор при использовании элементов больше 1 000 000 000 тоже пишет ахинею какую-то:
это иксэпшн. система не смогла выделить столько-то памяти.
0
 Аватар для OVERPOWER8
19 / 19 / 2
Регистрация: 29.11.2009
Сообщений: 224
22.01.2010, 15:51  [ТС]
>> zim22

это иксэпшн. система не смогла выделить столько-то памяти.
Да, я неправильно память рассчитал.

При 300 000 000 элементах используется 1.0 ... 1.1 Гб оперативки.

надо nothrow добавить.
0
depict1
 Аватар для zim22
281 / 146 / 4
Регистрация: 11.07.2009
Сообщений: 606
22.01.2010, 16:42
Цитата Сообщение от OVERPOWER8 Посмотреть сообщение
надо nothrow добавить.
не надо. надо просто ловить исключение.
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
22.01.2010, 17:10
Я же писал причину
https://www.cyberforum.ru/cpp/... post496717
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.01.2010, 17:10
Помогаю со студенческими работами здесь

Исправить код для сортировки двумерного массива
Здравствуйте! Укажите пожалуйста на мою ошибку. Нужно через быструю сортировку отсортировать двумерный массив, но что бы сортировались...

Как можно оптимизировать данный код?
И... Ещё один вопрос: Дан участок кода С++: #include &lt;iostream&gt; #include &quot;Windows.h&quot; using namespace...

Как еще короче записать данный код?
#include &lt;ios&gt; main() { system(&quot;for /f \&quot;tokens=1,2,3\&quot; %a in (input.txt) do set /a %a*%b*%c*2 &gt;output.txt&quot;); } подсказка...

Как правильно прописать данный код программы?
#include &lt;iostream&gt; #include &lt;clocale&gt; #include &lt;cmath&gt; #include &lt;cstdlib&gt; using namespace std; double masA={0}; long H(double...

Как работает данный код? И почему не компилируется?
Обьясните пожалуйста как работает данный код, и скажите почему он не компилируется? И есть ли способ считать числа еще быстрее? ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru