私は、マージソート(この目的のためのすべての最適化を考慮していない)を非常に素朴なバージョンで実装しようとしています。入力配列を参照で渡し、結合された要素をその中にコピーする従来の方法ではなく、結合された配列のマージソート - マージされた配列を入力配列にコピーするのではなく、新しい配列を返す
そのためには、私のコードは以下の通りです:
vector<int> merge(vector<int> left, vector<int> right)
{
vector<int> result;
int leftIdx = 0;
int rightIdx = 0;
int resultIdx = 0;
while (leftIdx < left.size() && rightIdx < right.size()) {
if (left[leftIdx] < right[rightIdx]) {
result[resultIdx++] = left[leftIdx++];
} else {
result[resultIdx++] = right[rightIdx++];
}
}
while (leftIdx < left.size()) {
result[resultIdx++] = left[leftIdx++];
}
while (rightIdx < right.size()) {
result[resultIdx++] = right[rightIdx++];
}
return result;
}
vector<int> MergeSort(vector<int> intArr)
{
vector<int> recresult;
// base - if array is of length 1, nothing to do, return it as is
if (intArr.size() == 1) {
return intArr;
} else {
int mid = intArr.size()/2;
// copy left half
vector<int> leftArr(intArr.begin(), intArr.begin() + mid);
// copy right half
vector<int> rightArr(intArr.begin() + mid, intArr.end());
MergeSort(leftArr);
MergeSort(rightArr);
recresult = merge(leftArr, rightArr);
}
return recresult;
}
私はマージからこの配列は、ローカル配列であることを知っているので、私は順番にそれを返すなるマージソートするためにそれを返しますよメインに。 これは、それ以降の再帰呼び出しの との間でやりとりされていないと仮定して間違っていますか?
このコードへの入力は{1,0,9}です。私は{0,1,9}になるはずですが、私は32767を得ます。
私はここで何が欠けていますか?
おそらくマージ 'の引数としてconst参照(' constのベクトル&intArr')を使用する必要があります() '元のアレイを変更せずにコピーを保存することができます。 'merge()'はconst参照も受け取ります。 「新しいベクターへのソート」の要件を達成する簡単な方法の1つは、ソートする前に新しいベクターにコピーすることです。あなたは戻り値の型について慎重に考えなければなりません。もしあなたがメガバイトのベクトルを通過しているなら、ひどくたくさんのコピーが続いています。 –