У меня нет большого опыта работы с переполнением стека, я думал, что они были вызваны рекурсивными функциями, превышающими определенную глубину рекурсии, почему они возникают здесь, в этой итеративной реализации сортировки слиянием!
#include<iostream>
#include <stdlib.h>
#define SIZE 3000000
int L[2500002];
int R[2500002];
using namespace std;
int min(int a, int b) {
return !(b<a) ? a : b;
}
void Merge(int data[], int p, int q, int r)
{
if (q >= SIZE)q = (r + p) / 2;
int sizeL = q - p + 2;
int sizeR = r - q + 1;
for (int i = 0; i < sizeL - 1; i++)
L[i] = data[i + p];
for (int i = 0; i < sizeR - 1; i++)
R[i] = data[i + q + 1];
int max;
if (L[sizeL - 2]>R[sizeR - 2])
max = L[sizeL - 2] + 1;
else
max = R[sizeR - 2] + 1;
L[sizeL - 1] = R[sizeR - 1] = max;
int indexL = 0, indexR = 0;
for (int i = p; i <= r; i++){
if (L[indexL] <= R[indexR]){
data[i] = L[indexL];
indexL++;
}
else{
data[i] = R[indexR];
indexR++;
}
}
}
void MergeSort(int data[], int p, int r)
{
for (int i = 1; i< SIZE; i *= 2)
for (int j = 0; j < SIZE; j += 2 * i)
Merge(data, j, j + i - 1, min((j + 2 * i - 1), SIZE - 1));
}
/*****************************************************************************/
bool IsSorted(int data[], int size)
{
int i;
for (i = 0; i<(size - 1); i++)
{
if (data[i] > data[i + 1])
return false;
}
return true;
}
int main()
{
int data[SIZE];
for (int i = 0; i < SIZE; i++)
data[i] = rand();
MergeSort(data,0,SIZE-1);
if(IsSorted(data, SIZE))
cout << "Sorted correctly";
else
cout << "incorrect sorting";
getchar();
return 0;
}
int
требуется 4 ГБ ОЗУ? Если вы посмотрите на связанный код, я вижу только четыре глобальных массиваint
, которые занимают около 80 МБ. - person Blastfurnace   schedule 04.04.2014int
внутриmain()
. Это слишком много для автоматического хранения (стека). - person Blastfurnace   schedule 04.04.2014