Ich weiß, dass es eine Menge dieser Implementierung hier in Stack gab, aber ich habe ein Problem, das ich nicht behandeln kann.Zählinversion mit merge sort
Zuerst habe ich die Merge-Sortierung bei khanacademy mit Javascript implementiert, dann schreibe ich den Code in C++ um und versuchte die Anzahl der Inversion in einem Array zu zählen.
Ich tat das Beste, was ich konnte, und verbrachte eine Stunde damit, zu verstehen, was ich falsch gemacht habe. Ich habe hier auf Stack nach einer anderen Implementierung gesucht und versucht, meinen Code zu korrigieren. Leider weiß ich nicht, was ich falsch mache. Ich denke, dass ich jede Inversion zähle. Vielen Dank im Voraus für eine Hilfe, verstanden zu haben, was falsch ist.
My Code:
int lowhalflength(int p, int q)
{
return q - p + 1;
}
int highhalflength(int q, int r)
{
return r - q;
}
int merge(int array[], int p, int q, int r, int lowhalf[], int highhalf[])
{
int k = p;
int i;
int j;
int count = 0;
for (int i = 0; k <= q; i++ , k++)
{
lowhalf[i] = array[k];
}
for (int i = 0; k <= r; i++ , k++)
{
highhalf[i] = array[k];
}
k = p;
i = 0;
j = 0;
while (i <= (q - p) && j <= r - (q + 1))
{
if (lowhalf[i] <= highhalf[j])
{
array[k] = lowhalf[i];
i++;
}
else
{
array[k] = highhalf[j];
j++;
count += q - 1;
}
k++;
}
while (i < lowhalflength(p, q))
{
array[k] = lowhalf[i];
k++;
i++;
}
while (j < highhalflength(q, r))
{
array[k] = highhalf[j];
k++;
j++;
}
return count;
}
Die MergeSort Funktion:
int mergeSort(int array[], int p, int r)
{
int q = ((p + r)/2);
int* lowhalf = new int[lowhalflength(p, q)];
int* highhalf = new int[highhalflength(q, r)];
int count = 0;
if (p < r)
{
q = ((p + r)/2);
count = mergeSort(array, p, q);
count += mergeSort(array, q + 1, r);
count += merge(array, p, q, r, lowhalf, highhalf);
}
delete[] lowhalf;
delete[] highhalf;
return count;
}
Für array [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] der Ausgang 46, während es 45
EDIT sein sollte: die Antwort zu ändern, ist die folgende Zeile q-1
bis q+j-k.
Ich habe es selbst gefunden, aber ich weiß nicht, wie ich es interpretieren soll. Jeder Hinweis oder Beweis, warum es richtig ist, wird wirklich wünschenswert sein.
Wahrscheinlich ein guter Ausgangspunkt, um zu lernen, wie Sie mit dem Debugger durch Ihren Code gehen und beobachten, Variablenwerte nach jedem Schritt ändern. –
Wo rufst du anfänglich mergeSort an? –
@o_weisman Ich verwende mergeSort so. Wenn ich 10 Elemente im Array habe, rufe ich cout << mergeSort (Array, 0,9); – FieryCod