嘿伙计们我正试图将这个javascript代码改为c ++。我正在快速排序,一切都是直接的,减去最后一步。
function quickSort(arr)
{
//base case if the arr is 1 or 0 then return the array
if(arr.length === 1 || arr.length === 0)
{
return arr;
}
var pivotIndex = Math.floor(arr.length/2);
var pivotValue = arr[pivotIndex];
var before = [];
var after = [];
for(var counter = 0; counter < arr.length; counter++)
{
if(counter === pivotIndex)
continue;
if(pivotValue <= arr[counter])
{
before.push(arr[counter])
}
else
{
after.push(arr[counter])
}
}
//this step I am having trouble rewriting in c++
return quickSort(after).concat(pivotValue).concat(quickSort(before));
}
我很难重写c ++中的递归步骤。我不确定如何连续2矢量。我尝试使用insert方法但是我一直收到有关无效使用void表达式的错误。
vector<int> quickSort(vector<int> arr)
{
if(arr.size() == 1 || arr.size() == 0)
{
return arr;
}
int pivotIndex = arr.size()/2;
int pivotValue = arr[pivotIndex];
vector<int> before;
vector<int> after;
//put values in before or after the piv
for(size_t counter = 0; counter < arr.size(); counter++)
{
if(counter == pivotIndex)
continue;
if(pivotValue <= arr[counter])
before.push_back( arr[counter]);
else
after.push_back( arr[counter]);
}
return //????? not sure how to do this
}
答案 0 :(得分:1)
所以,你意识到你的核心问题是&#34;如何连接两个vector
s&#34;,你找到了right answer: using insert
。现在你的问题是你为什么得到关于无效使用void表达式的错误。&#34; (这是我的答案的假设,至少。)
那是因为您可能会尝试执行以下操作:
return quickSort(after).insert( /* stuff */ );
这是错误的。在JavaScript中,array.concat
返回连接数组。它的返回类型实际上是Array
,因此return arr.concat(arr2)
返回Array
,因为arr.concat
会返回Array
。此外,在JavaScript中,array.concat
不会修改它所调用的数组,而是返回一个新数组。
但是,在C ++中, vector.insert
(#4 in the reference) returns void
。这意味着它什么都不返回。因此,当您尝试返回insert
的结果时,您会收到有关无效使用void表达式的错误。此外,在C ++中,vector.insert
会修改它被调用的vector
。
那么在这种情况下如何使用insert?
vector<int> quickSort(vector<int> arr)
{
// ...
// Sort `before` and `after`
before = quickSort(before);
after = quickSort(after);
// Modify `after` and return it.
after.push_back(pivotValue);
after.insert(after.end(), before.begin(), before.end());
return after;
}
注意:我的代码不是最优的,在C ++中重写JS的想法也很奇怪。我的回答是简单地概述问题中提出的问题,不提供快速排序的良好C ++实现。
答案 1 :(得分:0)
要连接两个向量,可以使用std :: merge
像:std::merge(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(dst));