Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 合并排序返回错误的值_C++ - Fatal编程技术网

C++ 合并排序返回错误的值

C++ 合并排序返回错误的值,c++,C++,我正在研究合并排序算法,但没有得到我想要的结果。我正在输入一个包含20个不同数字的文件。文件中的数字在程序中运行,但返回-84215041、-117594513和-2147483648。大部分为-84215051。我确实尝试过改变合并(A,0,n)到合并(A,数组的大小A,n)但这只给出了数字,没有对它们进行排序。我还尝试将p设为最大值,但结果与将p设为数组大小相同。任何关于我可以改变的观点都会有帮助 #include "stdafx.h" #include <iostream>

我正在研究合并排序算法,但没有得到我想要的结果。我正在输入一个包含20个不同数字的文件。文件中的数字在程序中运行,但返回-84215041、-117594513和-2147483648。大部分为-84215051。我确实尝试过改变
合并(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];
等。