C++ 插入排序导致分段错误:缩放后为11
我编写了一个简单的插入排序实现,试图打破对的信任,并开始我希望更好地理解一般的算法。该文件包含2000万个随机数。代码如下:C++ 插入排序导致分段错误:缩放后为11,c++,syntax,C++,Syntax,我编写了一个简单的插入排序实现,试图打破对的信任,并开始我希望更好地理解一般的算法。该文件包含2000万个随机数。代码如下: #include <fstream> #include <time.h> #include <cstdlib> using namespace std; void insertionSort(double numbers[], int array_size); int main() { int count; dou
#include <fstream>
#include <time.h>
#include <cstdlib>
using namespace std;
void insertionSort(double numbers[], int array_size);
int main() {
int count;
double twentyMMNumbers[20000000];
ifstream inputFile;
time_t now;
time(&now);
inputFile.open("20KRandomsNumbers.data"); //Opens input file
if(inputFile.fail())
{
printf("Cannot open inputFile");
exit(1);
}
count = 0;
printf("%d\n",count);
inputFile >> twentyMMNumbers[count];
printf("%f\n",twentyMMNumbers[count]);
while(inputFile)
{ //While loop
count++;
if(count < 20000000)
inputFile >> twentyMMNumbers[count];
}
inputFile.close();
printf("%s\n", ctime(&now)); //BEFORE
insertionSort(twentyMMNumbers, 20000000); //Insertion Sort 20KRandomNumbers
printf("%s\n", ctime(&now)); //AFTER
for(int i = 0; i < count; i++)
printf("%f\n",twentyMMNumbers[i]);
}
void insertionSort(double numbers[], int array_size)
{
int i, j, index;
for (i=1; i < array_size; i++)
{
index = numbers[i];
j = i;
while ((j > 0) && (numbers[j-1] > index))
{
numbers[j] = numbers[j-1];
j = j - 1;
}
numbers[j] = index;
}
}
这是因为我增加了阵列的大小吗?
PS如果你有任何关于优化这个的建议,请随意指出 您的while循环有问题:
while(inputFile)
{ //While loop
count++;
if(count < 20000000)
inputFile >> twentyMMNumbers[count];
}
while (inputFile) {
if (count >= dataSize) {
break;
}
inputFile >> twentyMMNumbers[count];
count++;
}
inputFile.close();
while(输入文件)
{//While循环
计数++;
如果(计数<20000000)
输入文件>>二十毫米数字[计数];
}
只有当文件包含while循环出现问题时,此循环才会终止:
while(inputFile)
{ //While loop
count++;
if(count < 20000000)
inputFile >> twentyMMNumbers[count];
}
while (inputFile) {
if (count >= dataSize) {
break;
}
inputFile >> twentyMMNumbers[count];
count++;
}
inputFile.close();
while(输入文件)
{//While循环
计数++;
如果(计数<20000000)
输入文件>>二十毫米数字[计数];
}
只有当文件包含时,此循环才会终止。具有讽刺意味的是(给定此站点名称),您的堆栈溢出。您需要在堆上动态分配这么多内存
为了更清楚,这一行:
double twentyMMNumbers[20000000];
需要
double* twentyMMNumbers = (double*)malloc(20000000*sizeof(double));
当然,您需要在退出程序之前释放内存(作为最佳实践):
具有讽刺意味的是(给定此站点名称),您有一个堆栈溢出。您需要在堆上动态分配这么多内存
为了更清楚,这一行:
double twentyMMNumbers[20000000];
需要
double* twentyMMNumbers = (double*)malloc(20000000*sizeof(double));
当然,您需要在退出程序之前释放内存(作为最佳实践):
它适用于较小的数组大小,因此这里有一些注释(因为它在CodeReview上)和一些较大数组大小的修复 1,如果要使用固定大小的数组,请使用常量,而不是
200000
(或20000000
)文本
2、使用动态数组更好。读取第一行后分配内存,并将读取的大小用作新数组的大小。此外,我会将数据文件的大小(文件的第一行)存储在单独的变量中,而不是存储在数组中
int dataSize;
inputFile >> dataSize;
double *twentyMMNumbers = new double[dataSize];
它分配确切的内存量。不多也不少
它还修复了分段错误。有关更多信息,请检查以下问题:
(不要忘记使用delete[]
取消分配数组)
3、如果记录多于数组大小,则无需读取整个文件。我将修改while循环:
while(inputFile)
{ //While loop
count++;
if(count < 20000000)
inputFile >> twentyMMNumbers[count];
}
while (inputFile) {
if (count >= dataSize) {
break;
}
inputFile >> twentyMMNumbers[count];
count++;
}
inputFile.close();
也许退出(-1)和错误消息会比中断更好
4、以下评论是不必要的:
//While loop
5,您应该将数组的实际大小传递给insertionSort
函数,因此编写以下代码:
insertionSort(twentyMMNumbers, dataSize);
这里的评论也没有必要
6、改进错误处理:当dataSize
的值大于文件中的数字时会发生什么情况
7,我将使用最后一个for
循环提取printary
函数以及readInput
函数
< P > 8,考虑使用C++样式打印代替代码> Prtff < /C> >:
cout << "Hello world!" << endl;
cout它适用于较小的数组大小,因此这里有一些注释(因为它在CodeReview上),以及一些针对较大数组大小的修复
1,如果要使用固定大小的数组,请使用常量,而不是200000
(或20000000
)文本
2、使用动态数组更好。读取第一行后分配内存,并将读取的大小用作新数组的大小。此外,我会将数据文件的大小(文件的第一行)存储在单独的变量中,而不是存储在数组中
int dataSize;
inputFile >> dataSize;
double *twentyMMNumbers = new double[dataSize];
它分配确切的内存量。不多也不少
它还修复了分段错误。有关更多信息,请检查以下问题:
(不要忘记使用delete[]
取消分配数组)
3、如果记录多于数组大小,则无需读取整个文件。我将修改while循环:
while(inputFile)
{ //While loop
count++;
if(count < 20000000)
inputFile >> twentyMMNumbers[count];
}
while (inputFile) {
if (count >= dataSize) {
break;
}
inputFile >> twentyMMNumbers[count];
count++;
}
inputFile.close();
也许退出(-1)
和错误消息会比中断更好
4、以下评论是不必要的:
//While loop
5,您应该将数组的实际大小传递给insertionSort
函数,因此编写以下代码:
insertionSort(twentyMMNumbers, dataSize);
这里的评论也没有必要
6、改进错误处理:当dataSize
的值大于文件中的数字时会发生什么情况
7,我将使用最后一个for
循环提取printary
函数以及readInput
函数
< P > 8,考虑使用C++样式打印代替代码> Prtff < /C> >:
cout << "Hello world!" << endl;
cout此站点用于查看工作代码。在stackoverflow上可以找到更好的修复代码的机会。我以前从未见过向stackoverflow的迁移。当然,托玛拉基雷特卡尔,比你想象的更普遍。“代码审查”会收到很多类似这样的代码帮助问题。@WinstonEwert:不管它值多少钱,它们也不是真正的帮助问题。:)此站点用于查看工作代码。在stackoverflow上可以找到更好的修复代码的机会。我以前从未见过向stackoverflow的迁移。当然,托玛拉基雷特卡尔,比你想象的更普遍。“代码审查”会收到很多类似这样的代码帮助问题。@WinstonEwert:不管它值多少钱,它们也不是真正的帮助问题。:)正如另一个答案所述,您也可以使用new
。我错过了这是C++,不是C,所以我使用了<代码> Malc C/代码>。但是,在C++中,也可以使用另一个答案,也可以使用<代码>新< /C>。我错过了这是C++,不是C,所以我使用了<代码> Malc C/代码>。不过,两个都可以用C++来工作。