C++ 合并排序返回错误的值
我正在研究合并排序算法,但没有得到我想要的结果。我正在输入一个包含20个不同数字的文件。文件中的数字在程序中运行,但返回-84215041、-117594513和-2147483648。大部分为-84215051。我确实尝试过改变C++ 合并排序返回错误的值,c++,C++,我正在研究合并排序算法,但没有得到我想要的结果。我正在输入一个包含20个不同数字的文件。文件中的数字在程序中运行,但返回-84215041、-117594513和-2147483648。大部分为-84215051。我确实尝试过改变合并(A,0,n)到合并(A,数组的大小A,n)但这只给出了数字,没有对它们进行排序。我还尝试将p设为最大值,但结果与将p设为数组大小相同。任何关于我可以改变的观点都会有帮助 #include "stdafx.h" #include <iostream>
合并(A,0,n)代码>到合并(A,数组的大小A,n)代码>但这只给出了数字,没有对它们进行排序。我还尝试将p设为最大值,但结果与将p设为数组大小相同。任何关于我可以改变的观点都会有帮助
#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <fstream>
#include <stdlib.h>
using namespace std;
void merge(int A[], int p, int q, int r) {
int i;
int j;
int k;
int n1 = q - p + 1;
int n2 = r - q;
double inf = std::numeric_limits<double>::infinity();
int* L = new int[n1 + 1];
int* R = new int[n2 + 1];
for (i = 0; i < n1; i++)
L[i] = A[p + i - 1];
for (j = 0; j < n2; j++)
R[j] = A[q + j];
L[n1 + 1 ] = inf;
R[n2 + 1 ] = inf;
i = 1;
j = 1;
for (k = p ; k < r; k++) {
if (L[i] <= R[j]) {
A[k] = L[i];
i++;
}
else{
A[k] = R[j];
j++;
}
}
}
void merges(int A[], int p, int r) {
if (p < r) {
int q = floor((p + r) / 2);
merges(A, p, q);
merges(A, q + 1, r);
merge(A, p, q, r);
}
}
void prin(int A[], int n) {
int j;
for (j = 0; j < n; j++)
printf("%d ", A[j]);
printf("\n");
}
int main()
{
fstream infile;
infile.open("number.txt");
if (infile.is_open()) {
int i;
int A[20];
int n = sizeof(A) / sizeof(*A);
int p = n;
for (int i = 0; i < n; i++) {
infile >> A[i];
}
merges(A, 0, n);
prin(A, n);
}
return 0;
}
#包括“stdafx.h”
#包括
#包括
#包括
#包括
使用名称空间std;
无效合并(int A[],int p,int q,int r){
int i;
int j;
int k;
int n1=q-p+1;
int n2=r-q;
double inf=std::numeric_limits::infinity();
int*L=新的int[n1+1];
int*R=新的int[n2+1];
对于(i=0;iA[i];
}
合并(A,0,n);
prin(A,n);
}
返回0;
}
使用std::vector
而不是C样式的固定数组。您可以使用std::vector
并保持所有其他函数(API)不变。指向数组开头的指针可以替换为a.data()
,数组的长度可以替换为a.size()
。我要改变的另一件事是,不要为L
和R
数组分配内存,只需在堆栈上声明它们,即int L[n1],R[n2];
最后,去掉inf
的东西,它对你要做的事情毫无意义,即递归地分割你的“数组”分成两半,然后再合并在一起
std::vector<int> a;
int number = 0;
std::ifstream infile("number.txt");
if (infile.is_open())
{
while (infile >> number)
{
a.push_back(number);
}
}
else
{
std::cout << "Error opening file!" << std::endl;
}
// call your functions like this with the vector
prin(a.data(), a.size());
std::向量a;
整数=0;
std::ifstream infle(“number.txt”);
if(infle.is_open())
{
同时(填充>>编号)
{
a、 推回(数字);
}
}
其他的
{
std::cout立刻,int*R=new int[n2+1];R[n2+1]=inf;
是未定义的行为。您试图写入已分配的内存范围之外。此外,floor((p+R)/2)中不需要floor
由于整数除法,结果已经是一个整数。一个文件中有20个数字?你能发布它以便我们可以复制吗?你的程序显然总是返回0。文件中的数字是6,4,64,9,87,45,1,5,48,63,7,12,90586,84,8,22,56999,76你也不需要为这些数组分配任何内存。只需int L[n1],R[n2];
等。