The code is too long to type out so I linked an easier to re
The code is too long to type out so I linked an easier to read version below:
http://pastebin.com/ryFc4X41
I get this error below when it tries to run the second algorithm:
Unhandled exception at 0x00D344F9 in ALGTAKE2.exe: 0xC00000FD: Stack overflow (parameters: 0x00000001, 0x01002FB8).
My question is how do I fix this? The debugger implies it has something to do with me passing int *&b as an argument in my ALG2 (MERGE-SORT) function, however, it has no issue with it in ALG1 nor ALG 3.
Solution
#include <iostream>
#include <string>
#include<stdlib.h>
#include <time.h>
#include <chrono>
#include <Windows.h>
using namespace std;
void ALG1(int *&, int);
void ALG2(int *&, int, int);
void MERGE(int *&, int, int, int);
void ALG3(int *&, int, int);
int PARTITION(int *&, int, int);
int main()
{
LARGE_INTEGER frequency;
LARGE_INTEGER t3, t4;
QueryPerformanceFrequency(&frequency);
int delta = 1000;
int ns = 1000;
int nf = 20000;
int m = 10;
int counter = 0;
double timealgo1[11];
double tavgalgo1[21];
unsigned timediff = 0;
int *B = new int[nf + 1];
int ** A = new int *[m + 1];
for (int i = 1; i <= m; ++i)
{
A[i] = new int[nf + 1];
}
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= nf; j++)
{
A[i][j] = rand();
}
}
cout << \"INSERT SORT\" << endl;
for (int n = ns; n <= nf; n = n + delta)
{
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
B[j] = A[i][j];
}
//auto start_time = std::chrono::high_resolution_clock::now();
QueryPerformanceCounter(&t3);
ALG1(B, n);
QueryPerformanceCounter(&t4);
//elapsedTime = (t4.QuadPart - t3.QuadPart) * 1000.0 / frequency.QuadPart;
//auto end_time = std::chrono::high_resolution_clock::now();
//auto time = end_time - start_time;
//timealgo1[i][n] = std::chrono::duration_cast<std::chrono::microseconds>(time).count();
timealgo1[i] = (t4.QuadPart - t3.QuadPart) * 1000.0 / frequency.QuadPart;
}
tavgalgo1[n / 1000] = 0;
for (int a = 1; a <= m; a++)
{
tavgalgo1[n / 1000] = tavgalgo1[n / 1000] + (timealgo1[a]);
}
tavgalgo1[n / 1000] = tavgalgo1[n / 1000] / m;
}
for (int n = ns; n <= nf; n = n + delta)
{
cout << tavgalgo1[n / 1000] << \"\\t\";
if (n == ns)
{
cout << \"ns\" << endl;
}
else if (n == ns + delta)
{
cout << \"ns + delta\" << endl;
}
else if (n>ns + delta)
{
counter = (n - ns) / delta;
cout << \"ns +\" << counter << \"delta\" << endl;
}
}
cout << \"MERGESORT\" << endl;
for (int n = ns; n <= nf; n = n + delta)
{
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
B[j] = A[i][j];
}
//auto start_time = std::chrono::high_resolution_clock::now();
QueryPerformanceCounter(&t3);
ALG2(B, 1, n);
QueryPerformanceCounter(&t4);
//elapsedTime = (t4.QuadPart - t3.QuadPart) * 1000.0 / frequency.QuadPart;
//auto end_time = std::chrono::high_resolution_clock::now();
//auto time = end_time - start_time;
timealgo1[i] = (t4.QuadPart - t3.QuadPart) * 1000.0 / frequency.QuadPart;
}
tavgalgo1[n / 1000] = 0;
for (int a = 1; a <= m; a++)
{
tavgalgo1[n / 1000] = tavgalgo1[n / 1000] + (timealgo1[a]);
}
tavgalgo1[n / 1000] = tavgalgo1[n / 1000] / m;
}
for (int n = ns; n <= nf; n = n + delta)
{
cout << tavgalgo1[n / 1000] << \"\\t\";
if (n == ns)
{
cout << \"ns\" << endl;
}
else if (n == ns + delta)
{
cout << \"ns + delta\" << endl;
}
else if (n>ns + delta)
{
counter = (n - ns) / delta;
cout << \"ns +\" << counter << \"delta\" << endl;
}
}
cout << \"QUICKSORT\" << endl;
for (int n = ns; n <= nf; n = n + delta)
{
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
B[j] = A[i][j];
}
//auto start_time = std::chrono::high_resolution_clock::now();
QueryPerformanceCounter(&t3);
ALG3(B, 1, n);
QueryPerformanceCounter(&t4);
//auto end_time = std::chrono::high_resolution_clock::now();
//auto time = end_time - start_time;
timealgo1[i] = (t4.QuadPart - t3.QuadPart) * 1000.0 / frequency.QuadPart;
}
tavgalgo1[n / 1000] = 0;
for (int a = 1; a <= m; a++)
{
tavgalgo1[n / 1000] = tavgalgo1[n / 1000] + (timealgo1[a]);
}
tavgalgo1[n / 1000] = tavgalgo1[n / 1000] / m;
}
for (int n = ns; n <= nf; n = n + delta)
{
cout << tavgalgo1[n / 1000] << \"\\t\";
if (n == ns)
{
cout << \"ns\" << endl;
}
else if (n == ns + delta)
{
cout << \"ns + delta\" << endl;
}
else if (n>ns + delta)
{
counter = (n - ns) / delta;
cout << \"ns +\" << counter << \"delta\" << endl;
}
}
return 0;
}
void ALG1(int *& b, int n)
{
int key = 0;
int i = 0;
for (int j = 2; j <= n; j++)
{
key = b[j];
i = j - 1;
while (i > 0 && b[i] > key)
{
b[i + 1] = b[i];
i = i - 1;
}
b[i + 1] = key;
}
}
void ALG2(int *&b, int p, int r)
{
if (p < r)
{
int q = p + r / 2;
ALG2(b, p, q);
ALG2(b, q + 1, r);
MERGE(b, p, q, r);
}
}
void MERGE(int *&b, int p, int q, int r)
{
int leftLength = q - p + 1;
int rightLength = r - q;
int *L = new int[leftLength + 1];
int *R = new int[rightLength + 1];
for (int i = 1; i <= leftLength; i++)
{
L[i - 1] = b[p + i - 1];
}
for (int j = 1; j <= rightLength; j++)
{
R[j - 1] = b[q + j];
}
L[leftLength] = 999;
R[rightLength] = 999;
}
void ALG3(int *&b, int p, int r)
{
if (p < r)
{
int q = PARTITION(b, p, r);
ALG3(b, p, q - 1);
ALG3(b, q + 1, r);
}
}
int PARTITION(int*&b, int p, int r)
{
int x = b[r];
int hold = 0;
int i = p - 1;
for (int j = p; j < r; j++)
{
if (b[j] <= x)
{
i++;
hold = b[i];
b[i] = b[j];
b[j] = hold;
}
}
b[r] = b[i + 1];
b[i + 1] = x;
return i + 1;
}




