我在合并排序代码中得到垃圾值 我尝试在C++中实现归并排序算法。这是我的代码。逻辑似乎很好。 但是我得到的输出是垃圾值,我无法从代码中找到问题所在。 我认为我的逻辑是正确的,但我不确定 #include <iostream> using namespace std; void Merge(int A[],int L[],int nL,int R[],int nR); void MergeSort(int A[]); //Function to Merge Arrays L and R into A. //nL = number of elements in L //nR = number of elements in R. void Merge(int A[],int L[],int nL,int R[],int nR) { // i - to mark the index of left subarray (L) // j - to mark the index of right sub-raay (R) // k - to mark the index of merged subarray (A) int i=0; int j=0; int k=0; while(i<nL && j<nR) { if(L[i]<=R[i]) { A[k]=L[i]; i=i+1; } else { A[k]=R[j]; j=j+1; } k=k+1; } while(i<nL) { A[k]=L[i]; i=i+1; k=k+1; } while(j<nR) { A[k]=R[j]; j=j+1; k=k+1; } } // Recursive function to sort an array of integers. void MergeSort(int A[],int n) { if (n<2) return;//base condition.If the array has less than two //elements, do nothing int mid=n/2; // create left and right subarrays // mid elements (from index 0 till mid-1) should be part of left sub- //array // and (n-mid) elements (from mid to n-1) will be part of right sub- //array int left[mid]; int right[n-mid]; for(int i=0;i<mid-1;i++) left[i]=A[i];// create left subarray for(int i=mid;i<n-1;i++) right[i-mid]=A[i];// create right subarray MergeSort(left,mid); MergeSort(right,n-mid); Merge(A,left,mid,right,n-mid); } int main() { int A[]={2,4,7,1,5,3}; int n=sizeof(A)/sizeof(A[0]); MergeSort(A,n); for(int i=0;i<n;i++) cout<<A[i]<<" "; return 0; } #包括 使用名称空间std; 无效合并(int A[],int L[],int nL,int R[],int nR); 无效合并排序(int A[]); //函数将数组L和R合并为A。 //nL=L中的元素数 //nR=R中的元素数。 无效合并(整数A[],整数L[],整数nL,整数R[],整数nR) { //i-标记左子阵列的索引(L) //j-标记右分区域的索引(R) //k-标记合并子阵列的索引(A) int i=0; int j=0; int k=0; 虽然(我

我在合并排序代码中得到垃圾值 我尝试在C++中实现归并排序算法。这是我的代码。逻辑似乎很好。 但是我得到的输出是垃圾值,我无法从代码中找到问题所在。 我认为我的逻辑是正确的,但我不确定 #include <iostream> using namespace std; void Merge(int A[],int L[],int nL,int R[],int nR); void MergeSort(int A[]); //Function to Merge Arrays L and R into A. //nL = number of elements in L //nR = number of elements in R. void Merge(int A[],int L[],int nL,int R[],int nR) { // i - to mark the index of left subarray (L) // j - to mark the index of right sub-raay (R) // k - to mark the index of merged subarray (A) int i=0; int j=0; int k=0; while(i<nL && j<nR) { if(L[i]<=R[i]) { A[k]=L[i]; i=i+1; } else { A[k]=R[j]; j=j+1; } k=k+1; } while(i<nL) { A[k]=L[i]; i=i+1; k=k+1; } while(j<nR) { A[k]=R[j]; j=j+1; k=k+1; } } // Recursive function to sort an array of integers. void MergeSort(int A[],int n) { if (n<2) return;//base condition.If the array has less than two //elements, do nothing int mid=n/2; // create left and right subarrays // mid elements (from index 0 till mid-1) should be part of left sub- //array // and (n-mid) elements (from mid to n-1) will be part of right sub- //array int left[mid]; int right[n-mid]; for(int i=0;i<mid-1;i++) left[i]=A[i];// create left subarray for(int i=mid;i<n-1;i++) right[i-mid]=A[i];// create right subarray MergeSort(left,mid); MergeSort(right,n-mid); Merge(A,left,mid,right,n-mid); } int main() { int A[]={2,4,7,1,5,3}; int n=sizeof(A)/sizeof(A[0]); MergeSort(A,n); for(int i=0;i<n;i++) cout<<A[i]<<" "; return 0; } #包括 使用名称空间std; 无效合并(int A[],int L[],int nL,int R[],int nR); 无效合并排序(int A[]); //函数将数组L和R合并为A。 //nL=L中的元素数 //nR=R中的元素数。 无效合并(整数A[],整数L[],整数nL,整数R[],整数nR) { //i-标记左子阵列的索引(L) //j-标记右分区域的索引(R) //k-标记合并子阵列的索引(A) int i=0; int j=0; int k=0; 虽然(我,c++,mergesort,C++,Mergesort,虽然可以理解, 在C++中,声明一个具有可变大小的数组是不可能的,例如:代码> int [Misty] < /代码>。 所有数组必须具有恒定的大小,例如int[10]或 const int mSize = 10; int[mSize] mArray... 您需要一个大小可变的存储容器。正如@PaulMcKenzie所建议的, 您可能需要使用向量对象。您的代码如下所示: #include <iostream> #include <vector> using namesp

虽然可以理解, 在C++中,声明一个具有可变大小的数组是不可能的,例如:代码> int [Misty] < /代码>。 所有数组必须具有恒定的大小,例如
int[10]

const int mSize = 10;
int[mSize] mArray...
您需要一个大小可变的存储容器。正如@PaulMcKenzie所建议的, 您可能需要使用向量对象。您的代码如下所示:

#include <iostream>
#include <vector>

using namespace std;
void Merge(vector<int>& A, vector<int>& L, vector<int>& R);
void MergeSort(vector<int>& A);

   //Function to Merge Arrays L and R into A. 
void Merge(vector<int>& A, vector<int>& L, vector<int>& R)
{ 
   // i - to mark the index of left subarray (L)
   // j - to mark the index of right sub-raay (R)
   // k - to mark the index of merged subarray (A)
   unsigned int i=0;
   unsigned int j=0;
   unsigned int k=0;
  while(i<L.size() && j<R.size())
   {
      if(L[i]<=R[i])
      { A[k]=L[i];
        i=i+1;
      }
      else
      { A[k]=R[j];
        j=j+1;
      }
      k=k+1;
  }
  while(i<L.size())
  { A[k]=L[i];
      i=i+1;
      k=k+1;
  }
  while(j<R.size())
  { A[k]=R[j];
    j=j+1;
    k=k+1;
  }
}
// Recursive function to sort an array of integers. 
void MergeSort(vector<int>& A)
{
  int n = A.size();
  if (n<2) return;//base condition.If the array has less than two 
                     //elements, do nothing
  int mid=n/2;
   // create left and right subarrays
   // mid elements (from index 0 till mid-1) should be part of left sub- 
      //array 
   // and (n-mid) elements (from mid to n-1) will be part of right sub- 
      //array
  vector<int> left(mid);
  vector<int> right(n-mid);

  for(int i=0;i<mid;i++) left[i]=A[i];// create left subarray
  for(int i=mid;i<n;i++) right[i-mid]=A[i];// create right subarray

  MergeSort(left);
  MergeSort(right);
  Merge(A,left,right);
}

int main()
{ vector<int> A={2,4,7,1,5,3};
  MergeSort(A);
  for(unsigned int i=0;i<A.size();i++) cout<<A[i]<<" ";

  return 0;
}
#包括
#包括
使用名称空间std;
无效合并(向量与A、向量与L、向量与R);
无效合并排序(向量&A);
//函数将数组L和R合并为A。
无效合并(向量与A、向量与L、向量与R)
{ 
//i-标记左子阵列的索引(L)
//j-标记右分区域的索引(R)
//k-标记合并子阵列的索引(A)
无符号整数i=0;
无符号整数j=0;
无符号整数k=0;

虽然(我这个问题已经在回答了,。但是我想我会发布一个答案,初学者会觉得我的答案很有价值,因为我在过去看到过很多次这样的问题。这一定是一个很受欢迎的家庭作业问题

我认为,如果这是一个现代C++赋值,使用索引就应该少得多。 所以在这个实现中,我没有使用std::merge,而是编写了merge,以便可以看到一些方法

避免使用这样的习惯用法:
使用namespace std;
我无法理解为什么要教授它。Typedef您的类型,它更清晰

using data_vect = std::vector<int>;

欢迎使用Stack Overflow!听起来您可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,您可以逐行执行程序,并查看程序偏离预期的地方。如果您要进行任何编程,这是一个必不可少的工具。进一步阅读:and
int left[mid]这是无效的C++。C++中的数组必须用常量表达式表示,而不是运行时值,如<代码> MID。使用<代码> STD::vector < /COD>。一旦开始使用<代码> vector < /代码>,就可以使用诸如<代码>()的函数。
检查边界条件。如果您的错误是由于访问超出边界的元素造成的,请不要感到惊讶。不要仅使用单字母变量名称(除非您想参加70年代的复古比赛;)。这段代码也很难读懂。你应该使用std::vector而不是C样式的数组。函数头包括merge。嗨,Sebastiaan,你在发布之前测试过你的代码吗?我编译时遇到了一大堆错误。不,我没有。我是在没有编译器的手机上写的。我会启动我的笔记本电脑并运行这个东西。你需要如果您想进行持久的更改并避免复制,请通过引用对每个
向量进行ss
。此外,您可能希望
A.size()
而不是
main()
中的
A,size()
。Jup,很抱歉输入错误
#include <iostream>
#include <vector>

using data_vect = std::vector<int>;
using dv_iter = data_vect::iterator;

data_vect Merge(data_vect& first, data_vect& second)
{
    data_vect result;
    dv_iter fval = first.begin();
    dv_iter sval = second.begin();
    for (;fval != first.end() || sval != second.end();)
    {
        if (fval == first.end())
            result.push_back(*sval++);
        else if (sval == second.end())
            result.push_back(*fval++);
        else if (*fval < *sval)
            result.push_back(*fval++);
        else
            result.push_back(*sval++);
    }
    return result;
}

void MergeSort(data_vect& input)
{
    int half = input.size() / 2;
    if (! half)
        return;

    data_vect left(input.begin(), input.begin() + half );
    data_vect right(input.begin() + half, input.end());

    MergeSort(left);
    MergeSort(right);
    input = Merge(left, right);
}

int main()
{
    data_vect A = { 6,2,7,4,1,5,3 };
    MergeSort(A);
    for ( auto& val : A )
        std::cout << val << " ";

    return 0;
}