2016-11-21 2 views
0

Ich soll eine Reihe von Zahlen nehmen: {51, 63, 48, 98, 75, 63, 92, 30, 32, 32, 36, 89, 4, 76 , 73, 90, 64, 99, 36, 96} und sortiere sie vom niedrigsten zum höchsten und dann vom höchsten zum niedrigsten.Verwenden der Einfügung Sortieren, um ein Array zu sortieren

Wenn ich versuche, den höchsten zu niedrigsten zu drucken, macht es den ersten Ausgang gleich. Sieht jemand Fehler in meinem Code?

package l7c14sort; 

import java.util.Arrays; 

public class L7C14Sort { 

public static void main(String a[]){ 
    int[] arr1 = {51, 63, 48, 98, 75, 63, 92, 30, 32, 32, 36, 89, 4, 76, 73, 90, 64, 99, 36, 96}; 


    int[] arr2 = doInsertionSort(arr1); 

    int[] arr3 = doInsertionSortAgain(arr1); 

    System.out.println("Original input: "+Arrays.toString(arr1)+"\n"); 
    System.out.println("Lowest to highest:\n"); 


    for(int i:arr2) 
    { 
     System.out.print(i); 
     System.out.print(", "); 

    } 
    System.out.println("\n\n"); 
    System.out.println("Highest to lowest:\n"); 

    for(int k:arr3) 
    { 
     System.out.print(k); 
     System.out.print(", "); 

    } 

    System.out.println("\n"); 
} 

public static int[] doInsertionSort(int[] input){ 

    int temp; 
    for (int i = 1; i < input.length; i++) { 
     for(int j = i ; j > 0 ; j--){ 
      if(input[j] < input[j-1]){ 
       temp = input[j]; 
       input[j] = input[j-1]; 
       input[j-1] = temp; 

      } 
     } 
    } 
    return input; 
} 

public static int[] doInsertionSortAgain(int[] input2){ 

    int temp2; 
    for (int k = 1; k < input2.length; k++) { 
     for(int j = k ; j > 0 ; j--){ 
      if(input2[j] > input2[j-1]){ 
       temp2 = input2[j]; 
       input2[j] = input2[j-1]; 
       input2[j-1] = temp2; 

      } 
     } 
    } 

    return input2; 
} 

}

Output:

Original input: [99, 98, 96, 92, 90, 89, 76, 75, 73, 64, 63, 63, 51, 
       48, 36, 36, 32, 32, 30, 4] 

höchsten zum niedrigsten:

99, 98, 96, 92, 90, 89, 76, 75, 73, 64, 63, 63, 51, 48, 36, 36, 32, 32, 30, 4, 

niedrigste:

4,30,32,32,36,36,48,51,63,63,64,73,75,76,89,90,92,96,98,99 

Antwort

1

Gute Nachrichten: Ihr Algorithmus funktioniert gut.

In Java werden Arrays als Referenz übergeben, nicht als Wert. Dies bedeutet, dass beim Setzen von int[] arr2 = doInsertionSort(arr1); das Array arr2 auf das Ergebnis der Methode doInsertionSort gesetzt wird, die nach dem Sortieren den Parameter input zurückgibt. Grundsätzlich zeigen arr1, arr2, arr3, input und input2 alle auf das gleiche Array.

Sie haben zwei einfache Möglichkeiten, die Tatsache zu beheben, dass Sie drucken:

  1. Restructure main(), so dass Sie ein Array verwenden: seinen Inhalt drucken, es ist eine Art der niedrigsten zur höchsten, wieder seinen Inhalt drucken, Sortiere es von oben nach unten und drucke dann den Inhalt erneut. (Dies ist wahrscheinlich, was Ihr Instructor für Sie vorhat, wenn dies Kursarbeit ist.)

  2. Erstellen Sie eine Kopie des input Parameters, um zu arbeiten. Sie können wie so mit System.arraycopy() dies tun:

    int[] myArray; System.arraycopy(input, 0, myArray, 0, input.length);

    Dann wird für die Option 2, können Sie Ihre Methode bearbeiten müssten myArray zu verwenden, anstatt input für jede andere Zeit, die Sie input verwenden.

Als Hinweis, brauchen Sie nicht Ihre Variablen input2 zu nennen, temp2 usw. Genau wie i, j und k den Gültigkeitsbereich verlassen und sind nach dem Ende einer for Schleife vergessen, Ihre Variablen input und temp bedeuten nichts außerhalb des Blocks, in dem Sie sie deklariert haben.

Hoffe, das hilft!

0

Sie haben die gleichen Ergebnisse, da Arrays veränderbar sind. Aufgrund des folgenden Codes wird das Eingabe-Array mutiert und sein endgültiger Wert wird gedruckt (Höchst- bis Tiefstwert).

int[] arr2 = doInsertionSort(arr1); 

int[] arr3 = doInsertionSortAgain(arr1); 

Wenn Sie organisieren Ihren Code wie:

public static void main(String a[]) { 
int[] arr1 = {51, 63, 48, 98, 75, 63, 92, 30, 32, 32, 36, 89, 4, 76, 73, 90, 64, 99, 36, 96}; 

System.out.println("Original input: " + Arrays.toString(arr1) + "\n"); 
System.out.println("Lowest to highest:\n"); 

int[] arr2 = doInsertionSort(arr1); 


for (int i : arr2) { 
    System.out.print(i); 
    System.out.print(", "); 

} 
System.out.println("\n\n"); 
System.out.println("Highest to lowest:\n"); 

int[] arr3 = doInsertionSortAgain(arr1); 

for (int k : arr3) { 
    System.out.print(k); 
    System.out.print(", "); 

} 
System.out.println("\n"); 

}

Sie sich erhalten:

Original-Eingang: [51, 63, 48, 98, 75, 63, 92, 30, 32, 32, 36, 89, 4, 76, 73, 90, 64, 99, 36, 96]

am niedrigsten zum höchsten: 4, 30, 32, 32, 36, 36, 48, 51, 63, 63, 64, 73, 75, 76, 89, 90, 92, 96, 98, 99,

Höchste bis niedrigste: 99, 98, 96, 92, 90, 89, 76, 75, 73, 64, 63, 63, 51, 48, 36, 36, 32, 32, 30, 4,