Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.96/25: Рейтинг темы: голосов - 25, средняя оценка - 4.96
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779

Переполнение стека в рекурсивной функции сортировки большого массива

09.04.2014, 23:04. Показов 5636. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Написал рекурсивную функцию сортировки массива, с массивами небольших размеров все работает как надо, а вот если сортирую побоьлше (60000 элементов) то выскакиевает исключение
Unhandled exception at 0x01017A2A in Filtering.exe: 0xC00000FD: Stack overflow (parameters: 0x00000001, 0x00292FFC).
подскажите пожалуйста что не так, а то первый раз сталкиваюсь с этим, вот код функции:
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
void Sort(photon *p, int b, int e)
{
    int ind = p[e].pos.x;
    int sI = e;
    int j = e-1;
    bool s(0);
 
    for(int i = b; i < e; i++)
    {
        if(p[i].pos.x >= ind)
        {
            while(p[j].pos.x >= ind && j > i)
            {
                j--;
            }
            if(j > i)
            {
                photon a = p[i];
                p[i] = p[j];
                p[j] = a;
                sI = i+1;
            }
        }
    }
 
    for(int i = b; i < e; i++)
    {
        if(p[i].pos.x >= ind)
        {
            photon a = p[i];
            p[i] = p[e];
            p[e] = a;
            sI = i;
            break;
        }
    }
 
    if(abs(b-(sI-1)) > 1)
        Sort(p, b, sI-1);
 
    if(abs((sI+1)-e) > 1)
            Sort(p, sI+1, e);
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
09.04.2014, 23:04
Ответы с готовыми решениями:

Переполнение стека при вызове рекурсивной функции
Вообщем есть у меня рекурсивный вызов функции, и как я понял у меня переполняется некий &quot;стек вызовов&quot; ( там рандом, так что...

При обращении к процедуре рекурсивной быстрой сортировки происходит переполнение стека
При обращении к процедуре рекурсивной быстрой сортировки происходит переполнение стека... Хотя директива увеличения размера стека...

Переполнение стека при рекурсивной сортировке
Вот код,который читает массив из файла и делает сортировку рекурсией using System; using System.Collections.Generic; using...

28
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
10.04.2014, 17:34
Студворк — интернет-сервис помощи студентам
taras atavin, то есть ты отрицаешь факт того, что быстрая сортировка может быть реализована через рекурсию?
0
20 / 20 / 8
Регистрация: 10.02.2013
Сообщений: 75
10.04.2014, 17:37
Цитата Сообщение от taras atavin Посмотреть сообщение
Там массив делится на подмассивы, но задача не делится на аналогичные для подмассивов и вообще вся сортировка построена на перестановках элементов только между подмассивами, а не внутри.
А сортировка слиянием?
0
Будущее рядом
 Аватар для TenGen
101 / 100 / 48
Регистрация: 06.03.2014
Сообщений: 342
10.04.2014, 17:40
Скорее всего уже говорили, но в таких случаях лучше передавать указатели на массив.
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
11.04.2014, 00:32  [ТС]
переделал алгоритм в итеративный вариант, но все равно медленно как-то, может кто-нибудь подскажет что не так ?
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
void Sort(photon *p, int b, int e)
{
    vector<XMFLOAT2> stack;
    int ind = p[e].pos.z;
    int sI = e;
    int j = e-1;
    bool s(0);
 
    do
    {
        for(int i = b; i < e; i++)
        {
            j = e-1;
            ind = p[e].pos.z;
            if(p[i].pos.z >= ind)
            {
                while(p[j].pos.z >= ind && j > i)
                {
                    j--;
                }
                if(j > i)
                {
                    photon a = p[i];
                    p[i] = p[j];
                    p[j] = a;
                    sI = i+1;
                }
                else
                    break;
            }
        }
        for(int i = b; i <= e; i++)
        {
            if(p[i].pos.z >= ind)
            {
                photon a = p[i];
                p[i] = p[e];
                p[e] = a;
                sI = i;
                if(e - i > 1)
                    stack.push_back(XMFLOAT2(sI+1, e));
                break;
            }
        }
 
        if(sI-b <= 1 && stack.size() > 0)
        {
            b = stack[stack.size()-1].x;
            e = stack[stack.size()-1].y;
            stack.pop_back();
            continue;
        }
 
        e = sI - 1;
 
 
    }while(e-b >= 1 || stack.size() != 0);
 
}
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.04.2014, 05:36
Большой массив нельзя отсортировать быстро, в худшем случае он сортируется очень медленно, в лучшем просто медленно. Это неизбежно от ресурсоёмкости самой задачи и любой рост быстродействия только только отодвинет планку размера массива.
0
20 / 20 / 8
Регистрация: 10.02.2013
Сообщений: 75
11.04.2014, 09:35
Цитата Сообщение от NEvOl Посмотреть сообщение
переделал алгоритм в итеративный вариант, но все равно медленно как-то, может кто-нибудь подскажет что не так ?
А какое у тебя максимальное значение в массиве? Если оно достаточно мало (относительно количеству элементов массива), то можно отсортировать за линейное время сортировкой подсчетом.
0
 Аватар для Voivoid
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
11.04.2014, 10:24
А разве сортировка вообще рекурсивна?
Лол, а как по-твоему пишутся сортировки в функциональных языках?

А топикстартеру же можно дать совет использовать оптимизацию хвостовой рекурсии, современные компиляторы её поддерживают
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.04.2014, 12:01
Цитата Сообщение от d1skort Посмотреть сообщение
А сортировка слиянием?
Ога. Вместо деления большого массива на маленькие рост подмассива, пока он не станет тождествен всему массиву. Ну очень рекурсивно. Ещё внешнюю сортировку вспомни, отчётливо воняющую итерациями через буфер.

Добавлено через 5 минут
Кроме того, простота разработки - вообще не фактор качества оси. Как раз с позиции разработчика приложений я и предпочитаю винду, но ось должна быть простой не для разработчика чего бы то ни было, а для пользователя, тем более если она не позиционируется на рынке, подобно фотону, как ось только для профессионалов.
0
20 / 19 / 1
Регистрация: 13.08.2012
Сообщений: 779
11.04.2014, 14:30  [ТС]
d1skort, значения в массиве произвольные, ну в разумных приделах к примеру [-1000; 1000]
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.04.2014, 14:30

Использование рекурсивной функции для сортировки массива по возрастанию
Описать рекурсивную функцию сортировки по возрастанию массива с n целых чисел. Идея метода такова: поместить наименьший элемент на первую...

Переполнение стека при первом же вызове функции
Обычно переполнение стека возникает при глубокой (в том числе бесконечной) рекурсии, не так ли? А тут функция вызывается первый раз, в...

Переполнение стека при вызове функции из Dll
Есть Dll на С++, в ней определена функция extern &quot;C&quot; __declspec(dllexport) long __stdcall Connect (long theSmartlinkTag, char*...

Переполнение стека при создании трехмерного массива
Нужно создать 2 трехмерных массива: long int mas, mas2; Но при данной записи, при запуске программы выдается сообщение о переполнении...

Сортировка двумерного массива (переполнение стека, что делать?)
Вообщем есть такое задание Составить программу сортировки двумерного квадратного массива по указанным правилам.(Стрелка указывает...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
сукцессия 15 неявная схема
anaschu 29.06.2026
Алиса Калибровка параметров симбиотической модели: технический обзор Содержание: Введение Постановка проблемы Технические аспекты реализации Процесс внедрения изменений
сукцессия 14. Обновленная схема модели
anaschu 28.06.2026
ГЛОБАЛЬНАЯ ОПИСАТЕЛЬНАЯ СПЕЦИФИКАЦИЯ ЭКОСИСТЕМНОЙ МОДЕЛИ «SOIL CHEMISTRY & MYCORRHIZA 2. 0» https:/ / ibb. co/ NnkGpfMd Представленная интегрированная схема описывает непрерывную нелинейную. . .
сукцессия 13. Питон модель трехзонного мицелия, пока что в основном арбускулярного
anaschu 28.06.2026
## Разработка агентной модели микоризной сукцессии: от выявления артефактов к созданию комплексной системы ### Аннотация Представлено исследование по разработке агентной модели микоризной. . .
сукцессия 12. краткий список проверок модели перед запуском.
anaschu 27.06.2026
Скрытые отказы в моделях систем динамики (SD-models) экологических систем: два случая из практики Контекст Разбирался прототип модели систем динамики (SD-модели) микоризной сукцессии: пять. . .
Сукцессия 11. Проверка орудий перед войной: разработка через тестирование
anaschu 27.06.2026
Как не дать модели соврать самой себе: проверки для симуляции микоризной сукцессии Введение Когда вы строите математическую модель живой системы — грибов, растений, почвы — главная опасность. . .
10 сукцессия. Питон код войны грибов и растений
anaschu 27.06.2026
import numpy as np class PlantAgent: def __init__(self, name, strategy, initial_biomass): self. name = name self. strategy = strategy # "greedy" (широколиственные) или. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru