2017-09-06 3 views
1

Lassen Sie mich zunächst sagen, dass ich weiß, dass es eine bessere Möglichkeiten zu sortieren, wo Sie etwas anderes als ein Array verwenden können. Dies ist eine Zuweisung für eine Klasse, in der der Benutzer Zeichenfolgen in einem Array speichern, löschen, anzeigen und sortieren kann. Ich bin völlig verloren, wohin ich von hier aus gehen soll. Ich versuche eine Blasensortierung zu verwenden und alles funktioniert, außer was immer der erste Eintrag in meinem Array nicht sortiert. Ich vermeide Null-Zeiger-Ausnahmen durch Herausfiltern von Null-Werten, weshalb meine if-Anweisung so lang ist.Java- Sortieren Sie ein String-Array manuell mit compareTo() -Methode

Ich habe eine Reihe von verschiedenen Möglichkeiten versucht, dies zu tun, und ich kann keinen guten Grund finden, warum dies nicht funktionieren sollte. Ich habe alles durchgesehen, was ich bei Stack Overflow finden konnte, soweit es Beispiele gibt, und niemand hat das gleiche Problem wie ich.

Zur Erinnerung, ich habe vielleicht 5 Saiten, "Derp", "Herp", "Sam", "Alfred", "Bill" und diese Sorte wird mir geben: "Derp", "Alfred", "Bill" , "Herp", "Sam". Vielen Dank im Voraus für die Führung.

+1

Zunächst ist dies nicht eine Blase Sortierung gibt es die erste Ausgabe – WIR3D

+0

@ WIR3D sollten Sie erklären, warum es nicht ist. Die innere Schleife einer Blasensortierung beginnt normalerweise bei "i + 1", nicht bei "1". Als Nebenbemerkung: Bitte geben Sie die Array-Klammern nach dem Typ an, nicht die Variable ('String [] cargohold' statt' String cargohold [] '). – Turing85

Antwort

3

Die Linie

if(cargohold[i] != null && cargohold[j] != null && (cargohold[i].compareTo(cargohold[j]) < 0)) 

sollte

if(cargohold[j] != null && cargohold[j-1] != null && (cargohold[j].compareTo(cargohold[j-1]) < 0)) 

sein und der Austausch wie getan werden sollte: in

temp = cargohold[j]; 
cargohold[j] = cargohold[j-1]; 
cargohold[j-1] = temp; 

dass Denken Sie daran, Bubblesort Sie benachbarte Elemente vergleichen , wo als Dein Code macht das nicht.

Flaw

wird es Fälle geben, wenn i > j und i < j, aber die Auslagerungslogik gleich bleibt, und das ist völlig falsch.

+1

Sie müssen auch verfolgen, ob ein Element geändert wurde oder nicht, so dass Sie wissen, wann die Sortierung abgeschlossen ist – WIR3D

+0

@ WIR3D, Das ist eine der diskreten Optimierung, die Sie tun können, aber das ist nicht der Punkt hier. –

+0

@SumeetSingh Können Sie mir erklären, warum das im Gegensatz zu meinem Code funktioniert? – user8570492

0

Ihre Implementierung ist falsch.

Hier Blasensortierung (in einem Java-like Kurzschrift):

for (index1 = 0; index1 < array.length - 1; ++index1) 
    for (index2 = index1 + 1; index2 < array.length; ++index2) 
     if (array[index1] < array[index1]) 
      swap(array[index1], array[index2]); 

note die index2 = index1 + 1 der inneren Schleife.

0

Bubblesort Algorithmus mit einigen Optimierungen:

private static void sortItems(String cargohold[]) { 
    String temp; 
    boolean wasSwap = true; 
    for (int index1 = 0; index1 < cargohold.length - 1 && wasSwap; ++index1) { 
     wasSwap = false; 
     for (int index2 = 0; index2 < cargohold.length - index1 - 1; ++index2) { 
      if (cargohold[index2].compareToIgnoreCase(cargohold[index2+1]) > 0) { 
       temp = cargohold[index2]; 
       cargohold[index2] = cargohold[index2+1]; 
       cargohold[index2+1] = temp; 
       wasSwap = true; 
      } 
     } 
    } 
} 

Durchschnittliche Komplexität O(n^2) mit dem besten Fall von O(n) zu sein.

Verwandte Themen