我在合并排序代码中得到垃圾值 我尝试在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++中,声明一个具有可变大小的数组是不可能的,例如:代码> int [Misty] < /代码>。 所有数组必须具有恒定的大小,例如我在合并排序代码中得到垃圾值 我尝试在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
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!听起来您可能需要学习如何使用调试器来逐步完成代码。有了一个好的调试器,您可以逐行执行程序,并查看程序偏离预期的地方。如果您要进行任何编程,这是一个必不可少的工具。进一步阅读:andint 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;
}