C++;用向量实现合并排序 我用C++实现了用向量代替数组的合并算法。我从最初的算法一步一步地工作,但是当我编译时,我没有得到任何输出或错误消息。我认为我的“合并”功能有问题,但我找不到它。我不熟悉排序算法,所以如果我的代码中有任何基本的误解或错误,请向我解释 #include <iostream> #include <vector> using namespace std; void mergeSort(vector<int>& numvec, int left, int right){ if(left < right){ int middle = left + (right - left) / 2; mergeSort(numvec, left, middle); mergeSort(numvec, middle + 1, right); merge(numvec, left, middle, right); } } int merge(vector<int>& numvec , int left, int mid, int right){ int i, j, k, temp[right-left+1]; i = left; j = right; k = mid + 1; while(i <= mid && j <= right){ if(numvec[i] < numvec[j]) { temp[k] = numvec[i]; k++; i++; } else { temp[k] = numvec[j]; k++; j++; } while(i <= mid){ temp[k] = numvec[i]; k++; i++; } while( j <= right){ temp[k] = numvec[j]; } for(i = left; i <= right; i++){ numvec[i] = temp[i - left]; } } } #包括 #包括 使用名称空间std; 无效合并排序(向量和numvec,左整数,右整数){ if(左
到目前为止,我在代码中发现的错误如下所示:C++;用向量实现合并排序 我用C++实现了用向量代替数组的合并算法。我从最初的算法一步一步地工作,但是当我编译时,我没有得到任何输出或错误消息。我认为我的“合并”功能有问题,但我找不到它。我不熟悉排序算法,所以如果我的代码中有任何基本的误解或错误,请向我解释 #include <iostream> #include <vector> using namespace std; void mergeSort(vector<int>& numvec, int left, int right){ if(left < right){ int middle = left + (right - left) / 2; mergeSort(numvec, left, middle); mergeSort(numvec, middle + 1, right); merge(numvec, left, middle, right); } } int merge(vector<int>& numvec , int left, int mid, int right){ int i, j, k, temp[right-left+1]; i = left; j = right; k = mid + 1; while(i <= mid && j <= right){ if(numvec[i] < numvec[j]) { temp[k] = numvec[i]; k++; i++; } else { temp[k] = numvec[j]; k++; j++; } while(i <= mid){ temp[k] = numvec[i]; k++; i++; } while( j <= right){ temp[k] = numvec[j]; } for(i = left; i <= right; i++){ numvec[i] = temp[i - left]; } } } #包括 #包括 使用名称空间std; 无效合并排序(向量和numvec,左整数,右整数){ if(左,c++,sorting,vector,mergesort,C++,Sorting,Vector,Mergesort,到目前为止,我在代码中发现的错误如下所示: int合并(vector&numvec,int左,int中,int右) 合并左向量和右向量时,必须返回合并后的向量 向量而不是int k=mid+1 k将从l开始,而不是从mid+1开始,因为在任何级别,我们都将从左向量的第一个索引开始填充元素,而不是从右向量的第一个元素开始填充元素,即mid+1 此外,还需要声明两个向量,以便在一个向量中从左到中存储元素,在另一个向量中从中到右存储元素 现在,如果您必须严格使用vector实现合并排序,那么您可
int合并(vector&numvec,int左,int中,int右)
合并左向量和右向量时,必须返回合并后的向量
向量而不是int
k=mid+1
k
将从l
开始,而不是从mid+1
开始,因为在任何级别,我们都将从左向量的第一个索引开始填充元素,而不是从右向量的第一个元素开始填充元素,即mid+1
向量合并(向量l,向量r)
{
向量res;
int i=0;
int j=0;
而(i!=l.size()&&j!=r.size())
{
如果(l[i]我至今能在代码中找到的错误如下:
int合并(vector&numvec,int左,int中,int右)
合并左向量和右向量时,必须返回合并后的向量
向量而不是int
k=mid+1
k
将从l
开始,而不是从mid+1
开始,因为在任何级别,我们都将从左向量的第一个索引开始填充元素,而不是从右向量的第一个元素开始填充元素,即mid+1
此外,还需要声明两个向量,以便在一个向量中从左到中存储元素,在另一个向量中从中到右存储元素
现在,如果您必须严格使用vector实现合并排序,那么您可以看到我的代码。
向量合并(向量l,向量r)
{
向量res;
int i=0;
int j=0;
而(i!=l.size()&&j!=r.size())
{
如果(l[i]第一个问题出现在下面的代码中:
int merge(vector<int>& numvec , int left, int mid, int right)
int合并(向量和numvec,int左,int中,int右)
您说过将返回一个整数,但从未返回任何内容。
同样对于mergeSort,您应该声明两个临时数组,一个用于右侧,另一个用于左侧,以便可以合并它们,但您从未这样做。最后,下面的代码毫无意义:
for(i = left; i <= right; i++){
numvec[i] = temp[i - left];
}
for(i=left;i第一个问题在下面的代码中:
int merge(vector<int>& numvec , int left, int mid, int right)
int合并(向量和numvec,int左,int中,int右)
您说过将返回一个整数,但从未返回任何内容。
同样对于mergeSort,您应该声明两个临时数组,一个用于右侧,另一个用于左侧,以便可以合并它们,但您从未这样做。最后,下面的代码毫无意义:
for(i = left; i <= right; i++){
numvec[i] = temp[i - left];
}
对于(i=left;我请提供一个,还请注意,可变大小的堆栈分配数组是非标准的gcc扩展,您应该使用向量
而不是temp[right-left+1]
--您已经在使用vector
。您也应该在这里使用它。您应该理解std::vector
存在的原因,并且它就是为了这个目的(动态数组)。我没有详细介绍,但您肯定需要从0开始计算k
,而不是从mid+1
另请参见:请提供一个,还请注意,可变大小堆栈分配数组是非标准gcc扩展,您应该使用向量
而不是temp[right-left+1]
--您已经在使用vector
。您也应该在这里使用它。您应该理解std::vector
存在的原因,并且它就是为了这个目的(动态数组)。我没有详细介绍,但您肯定需要从0开始计算k
,而不是从mid+1
另请参见: