新手请教,数据规模一变大就栈溢出

chenlingfeng22 2017-10-12 01:08:07
这个程序做的是计算不同数据规模下快速排序和随机化快速排序的运算时间(20组不同数据,然后求平均时间),规模在10,100,1000的时候还是正常的,但是规模到10000后就一直说栈溢出,求教如何解决这个问题

#include<iostream>
#include<windows.h>
#include<ctime>
#include<string.h>
#define scale 10000
using namespace std;

int partition(int* data, int start, int end) { //快速排序
int i = start, j = end, x = data[start];
while (i < j) {
while (i<j&&data[j]>x)
j--;
if (i < j)
data[i++] = data[j];
while (i < j&&data[i] < x)
i++;
if (i < j)
data[j--] = data[i];
}
data[i] = x;
return i;
}

int Random_partition(int* data, int start, int end) {
int i, temp;
i = start + rand() % (end - start + 1);

temp = data[start];
data[start] = data[i];
data[i] = temp;

return partition(data, start, end);
}

void Random_quicksort(int* data, int start, int end) {
if (start < end) {
int p = Random_partition(data, start, end);
Random_quicksort(data, start, p - 1);
Random_quicksort(data, p + 1, end);
}
}

void quicksort(int* data, int start, int end) {
if (start < end) {
int p = partition(data, start, end);
quicksort(data, start, p - 1);
quicksort(data, p + 1, end);
}
}

double Quicksort(int* testdata, int start, int end) {
int *data = new int[scale];
memcpy(data, testdata, sizeof(int)*scale);
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
double time;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime);

quicksort(data, 0, scale - 1);

QueryPerformanceCounter(&nEndTime);
time = (double)(nEndTime.QuadPart - nBeginTime.QuadPart) / (double)nFreq.QuadPart;

delete[]data;

return time;
}

double Random_Quicksort(int* testdata, int start, int end) {
int *data = new int[scale];
memcpy(data, testdata, sizeof(int)*scale);
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
double time;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime);

Random_quicksort(data, 0, scale - 1);

QueryPerformanceCounter(&nEndTime);
time = (double)(nEndTime.QuadPart - nBeginTime.QuadPart) / (double)nFreq.QuadPart;

delete[]data;

return time;
}


int main() {
int *data;
double averagetime[4] = { 0,0,0,0 };
srand(time(0));

for (int k = 0; k < 20; ++k) {
data = new int[scale];
for (int i = 0; i < scale; ++i) {
data[i] = rand();
}
averagetime[0] += Quicksort(data, 0, scale - 1);
averagetime[1] += Random_Quicksort(data, 0, scale - 1);

delete[]data;
}
cout << "普通序列下快速排序的平均时间为: " << averagetime[0] / 20 << endl;
cout << "普通序列下随机化快速排序的平均时间为: " << averagetime[1] / 20 << endl;

cout << endl;

for (int k = 0; k < 20; ++k) {
data = new int[scale];
for (int i = 0; i < scale; ++i) {
data[i] = i;
}
averagetime[2] += Quicksort(data, 0, scale - 1);
averagetime[3] += Random_Quicksort(data, 0, scale - 1);

delete[]data;
}
cout << "有序序列下快速排序的平均时间为: " << averagetime[2] / 20 << endl;
cout << "有序序列下随机化快速排序的平均时间为: " << averagetime[3] / 20 << endl;



return 0;
}
...全文
162 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
热血打工人 2017-10-12
  • 打赏
  • 举报
回复
vs的堆栈大小默认是1M。可以手动增加堆栈大小 http://blog.csdn.net/qq_27372933/article/details/46964685
ooolinux 2017-10-12
  • 打赏
  • 举报
回复
引用 2 楼 cfjtaishan 的回复:
[quote=引用 1 楼 u010165006 的回复:] 函数局部变量或数组分配在栈中,栈大小一般只有几M。可以改成静态变量或全局变量(全局内存区),或者动态分配内存(在堆上)。
看代码不是在栈上申请的,每次data都是new。 [/quote] 哦,没细看
自信男孩 2017-10-12
  • 打赏
  • 举报
回复
引用 1 楼 u010165006 的回复:
函数局部变量或数组分配在栈中,栈大小一般只有几M。可以改成静态变量或全局变量(全局内存区),或者动态分配内存(在堆上)。
看代码不是在栈上申请的,每次data都是new。
ooolinux 2017-10-12
  • 打赏
  • 举报
回复
函数局部变量或数组分配在栈中,栈大小一般只有几M。可以改成静态变量或全局变量(全局内存区),或者动态分配内存(在堆上)。

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧