Optimiert Bubble-Sort (Java)
Ich würde gerne wissen, wie ich sonst noch optimieren kann bubble sort, so dass es mit Blick auf die Elemente bereits sortiert, sogar nach dem ersten Durchgang.
Eg. [4, 2, 3, 1, 5, 6] --> [2, 3, 1, **4, 5, 6**]
Beobachten wir, dass [4,5,6] sind bereits sortiert, wie kann man ändern, meinen code so, dass es mit Blick auf diese 3 Elemente in den nächsten Durchgang? (das heißt, die Art wäre effizienter?)
Empfehlen Sie eine rekursive Methode?
public static void bubblesort(int[] a) {
for(int i=1; i<a.length; i++) {
boolean is_sorted = true;
for(int j=0; j<a.length; j++) {
if(a[j] > a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
is_sorted = false;
}
}
if(is_sorted) return;
}
}
Vielen Dank für Ihre Zeit!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst von allen, haben Sie eine out-of-bounds Zugriff:
für
j == a.length-1
, so dass die Schleife Bedingung sollte eher seinj < a.length-1
.Aber in der Bubble-sort, wissen Sie, dass nach
k
geht, die größtek
Elemente sind sortiert in diek
letzten Einträge des Arrays, also die herkömmlichen Bubble-sort verwendetNun, das würde noch eine Menge von unnötigen Iterationen, wenn das array hat eine lange sortiert tail der größten Elemente, sagen, Sie haben
k,k-1,...,1
als die erstenk
Elemente undk+1
zu100000000
um danach. Der standard-Bubble-sort passierenk
mal durch (fast) das gesamte array.Aber wenn Sie sich erinnern, wo Sie Ihre letzten swap, wissen Sie, dass nach diesem index sind die größten Elemente in der Reihenfolge, so
Sortieren würde das obige Beispiel mit nur einem Durchlauf durch das gesamte array, und die restlichen Pässe nur durch ein (kurzer) Präfix.
Natürlich im Allgemeinen, dass nicht kaufen Sie viel, aber dann die Optimierung ein Bubble-sort ist ein eher aussichtsloses Unterfangen sowieso.
currentSwap
variable.sollten Sie eine variable "Größe" für die innere Schleife und ändern Sie es auf den neuesten getauscht element in jedem Zyklus.Auf diese Weise Ihre innere Schleife geht bis zu der neuesten "ausgelagert" - element und übergibt den rest, die unswapped (aka in Ihren correctplace). ich.e
Ich eine Methode entwickelt, reduziert die Anzahl der Iterationen, die durch den Ausschluss von teilen am Anfang und Ende des Arrays, die bestellt wurden, die in vorherigen Schleifen.
Aber als @Daniel Fischer sagte in einer früheren Antwort, es macht nicht viel mit größeren arrays.
Im obigen Beispiel, wird das array sortiert habe nach dem 3. pass, aber wir werden noch weiter mit der 4., 5. - pass. Nehme an, wenn das array bereits sortiert, dann gibt es kein swapping (weil benachbarte Elemente sind immer in Ordnung), aber trotzdem werden wir weiterhin mit den Pässen und es wird immer noch (n-1) übergibt.
Wenn wir erkennen können, dass das array sortiert ist, dann sollten wir aufhören, die Ausführung der weiter geht. Dies ist die Optimierung der original bubble-sort-Algorithmus.
Wenn es keinen Austausch in einem bestimmten Durchgang, es bedeutet, dass das array sortiert werden, also sollten wir nicht durchführen, der weiter geht. Für diese können wir eine flag-variable, die auf true gesetzt wird vor jedem Durchlauf und ist false, wenn ein Austausch durchgeführt wird.
Ich denke, das ist, was Sie brauchen. Der Schlüssel ist, zu betrachten, die
array nur bis zu dem index, in dem letzten swap aufgetreten(newn).
Optimiert bubble-sort mit nur 1 Schleife