2017-02-10 4 views
-2

Dies ist mein Code für verbesserte Bubble-Sortierung mit Boolean.Verbesserte Bubble Sort, irgendwann funktioniert, irgendwann nicht

import java.util.Scanner; 

class BubbleSort { 
    public static void main(String args[]) { 
     Scanner s = new Scanner(System.in); 
     int[] array = new int[5]; 
     int temp; 
     boolean swap; 
     int count = 0; 
     for(int i = 0 ; i < array.length ; i++) { 
      System.out.println("Enter a number!"); 
      array[i] = s.nextInt(); 
     } 
     for(int i = 0 ; i<array.length-1; i++) { 
      swap = false; 
      for(int j = i + 1 ; j < array.length ; j++) { 
       count++; 
       if(array[i] > array[j]) { 
        temp = array[i]; 
        array[i] = array[j]; 
        array[j] = temp; 
        swap = true; 
       } 
      } 
      if(!swap) { 
       break; 
      } 
     } 
     for(int i = 0 ; i < array.length ; i++) { 
      System.out.println(array[i]); 
     } 
     System.out.println(); 
     System.out.println(count); 
    } 
} 

Dieser Code manchmal für mich aussortiert, aber manchmal nicht.

Ich benutze zählen, um zu finden, wie viele Vergleiche hat der Computer machen, so dass ich weiß, dass ich verbesserte Blase Sorte und nicht die einfache verwenden.

Zuerst frage ich den Benutzer, fünf Zahlen zu sortieren.

Wenn die Zahlen sind: 5 4 3 2 1

die sortierte Liste ist 1 2 3 4 5 und es zeigt die Anzahl der Vergleiche als 10

oder

wenn die Zahlen: 1 2 3 4 5

die sortierte Liste ist 1 2 3 4 5 Vergleich ist 4 (das ist auch richtig, weil es nur 4 Vergleiche hat).

ABER

wenn der Benutzer eingibt: 1 3 2 4 5

die sortierte Liste ist 1 3 2 4 5 (nicht ändern) und die Anzahl der Vergleiche ist 4.

So hat es nicht 3 tauschen und 2.

Was ist falsch mit meinem Code? Ist es wegen der Pause in der for-Schleife, wenn ich 1 und 3 vergleiche?

+0

Was ist passiert, als Sie das Debugging probiert haben? – shmosel

+1

Dies ist keine Bubble-Sortierung. Dies ist Auswahlsortierung. Nun, wenn es funktioniert, wäre es. –

+0

@smossel wenn ich die nummer wie 1 3 2 4 5 benutze, ist die sortierte liste immer noch die selbe wie vorher, das heißt es hat sich nicht getauscht und es heißt ich habe nur 4 vergleiche. – Secret

Antwort

1

Was stimmt nicht mit meinem Code?

Das Problem ist die swap Variable und die Tatsache, dass Sie aus der äußeren Schleife sind zu brechen, wenn es ein einzelnes Element im Vergleich zu allen folgenden und nie tauschen.

Im Beispiel Sie zur Verfügung gestellt: 1,3,2,4,5 die äußeree Schleife mit 1 lief, und da es die kleinste ist die swap nie das nächste Element zu true und die Logik brach gesetzt wurde vor dem Erreichen (3) .

Festcode (einfach die „Verbesserung“ zu entfernen):

Scanner s = new Scanner(System.in); 
    int[] array = new int[5]; 
    int temp; 
    int count = 0; 
    for(int i = 0 ; i < array.length ; i++) 
    { 
     System.out.println("Enter a number!"); 
     array[i] = s.nextInt(); 
    } 
    for(int i = 0 ; i<array.length; i++) 
    { 
     for(int j = i + 1 ; j < array.length ; j++) 
     { 
      count++; 
      if(array[i] > array[j]) 
      { 
       temp = array[i]; 
       array[i] = array[j]; 
       array[j] = temp; 
      } 
     } 
    } 
    for(int i = 0 ; i < array.length ; i++) 
    { 
     System.out.println(array[i]); 
    } 
    System.out.println(); 
    System.out.println(count); 

Hinweis: als ich in den Kommentaren oben geschrieben habe, ist dies nicht Blase Art seit Blase Art tauscht zwei benachbarte Elemente, wenn sie sind in der falschen Reihenfolge, während hier der Vergleich zwischen array[i] und array[j] gemacht wird, die nicht notwendigerweise benachbart sind.

+0

Lehrer wollen wir eine neue Blase Sort-Code mit Boolean – Secret

+2

@Secret Ihre Frage war nicht Ihre HW für Sie tun, sondern hilft Ihnen eher zu finden, was war falsch mit der Implementierung, die Sie vorgeschlagen haben. Wenn du deine HW lieber kopierst, als es selbst zu tun, dann pass auf: https://de.wikibooks.org/wiki/Algorithm_Implementation/Sorting/Bubble_sort#Java – alfasin

0

Die Bedingungen für die Schleife auf der inneren Schleife sind nicht korrekt. Die Arrayvergleichs- und Auslagerungslogik war ebenfalls falsch. Wie in den Kommentaren erwähnt, führt Ihr Code keine Bubble-Sortierung durch.

Hinweis:

für die innere Schleife, j sollte solange j < array.length - i - 1 bei 0 und Schleife starten. array[j] und array[j + 1] sollten ausgetauscht werden, wenn array[j] > array[j + 1].

+0

Weißt du, wie man den Vergleich des Computers berechnet ?? Ich gehe zurück und tippe diesen Code ohne boolean (normaler Blasenkodierungscode) aus und ich habe 16 Vergleich – Secret

+0

@Secret Im schlimmsten Fall würde die äußere Schleife 'n - 1' mal ausführen, und (angenommen 'n = 5 ') die innere Schleife würde 4 mal ausgeführt werden, dann 3, dann 2, dann 1 mal, was zu "(n - 1) * n/2" Vergleichen führt. Im besten Fall würde die äußere Schleife einmal ausgeführt, und die innere Schleife würde "n - 1" mal durchlaufen, was zu "n - 1" Vergleichen führt. – badjr

Verwandte Themen