新手请教,数据规模一变大就栈溢出
这个程序做的是计算不同数据规模下快速排序和随机化快速排序的运算时间(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;
}