Ich kann in Java als neu betrachtet werden. Ich habe mit einer Frage gekämpft, die uns von unserem Professor an unserer Schule gestellt wurde. Ich sollte einen natürlichen Merge-Sort-Algorithmus erstellen, der jedes Mal zwei sortierte Sub-Arrays finden und diese zusammenführen muss (was eine Version von Bottom-Up-Merge-Sort ist). Aber ich steckte hier ist mein CodeJava Natural Merge Sort Implementierung
public class NaturalMergeMine {
private static Comparable[] aux;
public static void sort(Comparable[] a) {
aux = new Comparable[a.length];
sort(a, 0, a.length - 1);
}
public static boolean isSorted(Comparable[] a) {
for (int i = 1; i < a.length; i += 1) {
if (a[i - 1].compareTo(a[i]) < 0) {
return false;
}
}
return true;
}
private static void sort(Comparable[] a, int lo, int hi) {
int i = lo;
int j = 0;
int mid = 0;
int az = 0;
while (true) {
i = 0;
System.out.println("outter");
while (i < a.length) {
System.out.println("inner 1");
if (i == a.length - 1) {
break;
} else if (a[i].compareTo(a[i + 1]) < 0) {
break;
}
i++;
}
j = i + 1;
while (j < a.length) {
System.out.println("inner 2");
if (j == a.length - 1) {
break;
} else if (a[j].compareTo(a[j + 1]) < 0) {
break;
}
j++;
}
mid = lo + (j - lo)/2;
Merge(a, lo, mid, j);
lo = 0;
if (isSorted(a)) {
break;
}
}
}
public static void Merge(Comparable[] a, int lo, int mid, int hi) {
int i = lo;
int j = mid + 1;
for (int k = lo; k <= hi; k++) {
aux[k] = a[k];
}
for (int k = lo; k <= hi; k++) {
if (i > mid) {
a[k] = aux[j++];
} else if (j > hi) {
a[k] = aux[i++];
} else if (aux[i].compareTo(aux[j]) < 0) {
a[k] = aux[j++];
} else {
a[k] = aux[i++];
}
}
}
public static void show(Comparable[] a) {
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
public static void main(String[] args) {
Integer[] arr = {6, 4, 5, 7, 8, 3, 2, 1};
sort(arr);
show(arr);
}
}
, was passiert, ist, dass es nicht richtig verschmilzt und es geht in einer Endlosschleife in der äußer-Schleife, die ist, weil es nicht richtig sortiert ist. Gibt es jemanden, der mir einen besseren Weg geben kann oder mir den Fehler erzählen kann, den ich hier mache? Danke im Voraus.
Vielen Dank, aber ist dies nicht die normale Implementierung von Top-Down-Merge-Sort. Ich habe ein Problem damit, die 2 sortierten Subarrays zu finden und sobald ich sie finde, sollte ich sie zusammenführen. Und das ist vielleicht nicht genau die Hälfte des Arrays. – adropintheocean
Dies ist der standardmäßige Zusammenführungssortieralgorithmus, nicht der natürliche Zusammenführungssortieralgorithmus. OP hat klargestellt, dass das Problem innerhalb des Merge-Teils liegt. Wenn Sie in diesem Teil einen Fehler gefunden und verfälscht haben, wäre es vorteilhaft, wenn Sie die Änderungen im Detail erklären. – Turing85
Eigentlich habe ich die Merge-Methode im Standard Merge Sort-Algorithmus implementiert und es hat richtig funktioniert. Ich habe die gleiche Merge-Methode hier verwendet. Der einzige Teil, den ich in dem oben beschriebenen Code geändert habe, ist sort (Comparable [] a, int lo .....). Aber es tut nicht, was ich ursprünglich wollte. – adropintheocean