Ich versuche eine sehr naive Version von Merge Sort zu implementieren (ohne Berücksichtigung aller Optimierungen für diesen Zweck), wo mein Ziel ist, eine neue Kopie zurückzugeben des zusammengeführten Arrays statt der herkömmlichen Methode, das Eingabearray durch Referenz zu übergeben und die zusammengeführten Elemente darin zu kopieren.Merge Sort - gebe ein neues Array zurück, anstatt das zusammengefügte Array in das Eingabearray zu kopieren
Zu diesem Zweck ist mein Code wie folgt:
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;
}
Ich weiß, dass dieses Array von merge ein lokales Array ist, und ich bin die Rückkehr es daher mergesort was wiederum darauf zurück zu main. Bin ich falsch bei der Annahme, dass dies von nachfolgenden rekursiven Aufrufe nicht ein- und ausgeht?
Mein Testeingang für diesen Code ist {1,0,9}. Ich sollte {0,1,9} bekommen, aber ich bekomme 32767.
Was fehlt mir hier?
Sie wahrscheinlich eine konstante Referenz verwendet werden soll ('const Vektor & intArr') als Argument an' MergeSort() ' um beim Kopieren zu sparen, ohne das ursprüngliche Array zu modifizieren. Die 'merge()' könnte auch const-Referenzen haben. Eine einfache Möglichkeit, die Anforderung "In neuen Vektor sortieren" zu erreichen, besteht darin, vor dem Sortieren in einen neuen Vektor zu kopieren. Sie müssen sorgfältig über den Rückgabetyp nachdenken - oder vielleicht auch. Wenn Sie Megabyte-Vektoren übergeben, wird sehr viel kopiert. –