Ich habe eine Mergesort-Merge-Funktion implementiert, aber obwohl ich sie so gut wie möglich kopiert habe, bin ich auf das Problem gestoßen, wenn die linken, mittleren, rechten Parameter 0,0,1 sind. In diesem Fall scheint die Logik völlig ruiniert zu sein. Wenn das Eingangsfeld 14,7 eingegeben wird, werden 14,7 ausgegeben. Der Grund ist, dass links == Mitte und so wird es sofort eingefügt.Was sollte in einer Mergesort-Merge-Funktion getan werden, wenn die Array-Länge geradzahlig ist, insbesondere in dem Fall, in dem Größe = 2 ist?
Die Mergesort-Funktion hat hier Testfälle bestanden, aber es wird nur die Merge-Funktion debuggt.
Ich hätte gedacht, dass die 0,0,1 ist eine ungültige Parameter-Spezifikation, aber nein, gibt es keine andere Möglichkeit, das mittlere Element in einer Länge = 2-Array übergeben.
Ich habe versucht, meinen Code aus zur Basis von https://www.cs.cmu.edu/~adamchik/15-121/lectures/Sorting%20Algorithms/code/MergeSort.java
// Takes in an array that has two sorted subarrays,
// from [p..q] and [q+1..r], and merges the array
var merge = function(array, p, q, r) {
console.log(array);
console.log(p);
console.log(q);
console.log(r);
var tmp = {};
var k = p;
var middle = q;
while(p<=middle && q <= r){
console.log("aaa");
console.log(array[p]);
console.log(array[q]);
console.log("bbb");
if (array[p] < array[q]){
tmp[k] = array[p];
k++;
p++;
} else {
tmp[k] = array[q];
k++;
q++;
}
}
while(p<middle){
//tmp[k] = array[p];
k++;
p++;
}
while(r >= q){
//tmp[k] = array[q];
k++;
q++;
}
for(var i in tmp){
array[i] = tmp[i];
}
console.log(array);
console.log(tmp);
console.log("test");
};
// Takes in an array and recursively merge sorts it
var mergeSort = function(array, p, r) {
var lowerIndex = p;
var higherIndex = r;
if (lowerIndex < higherIndex) {
var middle = Math.floor(lowerIndex + (higherIndex - lowerIndex)/2);
// Below step sorts the left side of the array
mergeSort(array,lowerIndex, middle);
// Below step sorts the right side of the array
mergeSort(array,middle + 1, higherIndex);
// Now merge both sides
merge(array,lowerIndex, middle, higherIndex);
}
};
var array = [14, 7, 3, 12, 9, 11, 6, 2];
array = [14, 7];
mergeSort(array, 0, array.length-1);
console.log("Array after sorting: " + array);
//Program.assertEqual(array, [2, 3, 6, 7, 9, 11, 12, 14]);
Quicksort ist ein Algorithmus; merge sort ist ein anderes. Es spielt keine Rolle, ob die Subarrays unterschiedlich lang sind. Der Fehler ist wahrscheinlich eine inkonsistente Verwendung von Indizes. Ist 'mid' das letzte Element im linken Array oder das erste Element im rechten Array? Der Ausdruck 'while (p <= Mitte)' wirkt verdächtig. –
@MOehm Tut mir leid. Es ist Mergesort.Der Wert "mid" in diesem Fall "q" ist sowohl das letzte Element im linken als auch das erste Element im rechten. Das liegt daran, dass das Array [14,7] ist und kein "mittleres" Element vorhanden ist. Ich bin mir nicht ganz sicher, wie ich es im einen oder anderen Fall richtig bezeichnen soll. – user1122069
Das war eine rhetorische Frage an Sie. Sie sollten prüfen, ob 'center' konsistent in Ihrem Code verwendet wird. –