2016-07-19 17 views
1

Ich habe ein Problem mit meiner Zusammenführung sortieren, wenn ich meine sortedArray druckt es nur [0.0, 0.0 .....] Ich bin nicht sicher, ob es einen Fehler in meiner Bankleitzahl oder in meiner Druckzeile oder wenn es sich um Doubles handelt. Der Code, den ich uns unten gepostet habe.Mergsort Drucken ein seltsames Ergebnis

Durch den Aufruf System.out.println (toString (sortedArray) ich eine noch obskure Antwort.

Vielen Dank für jede Hilfe.

package mergesort; 

import java.util.Arrays; 
import java.util.Random; 

public class mergesort { 
    public static void main(String[] args) { 
     double[] array = getIntArray(); 
     long before = System.nanoTime(); 
     double[] sortedArray= mergeSort(array); 
     System.out.println("Sorting took "+ (System.nanoTime() - before) +" nanoseconds "); 
     System.out.println(toString(array) + "\n\n" + toString(sortedArray) + "\n main method completed in: " + (System.nanoTime() - before) + " nanoseconds."); 

    } 


    private static String toString(double[] array) { 
     StringBuilder sb = new StringBuilder("[ "); 
     double len = array.length; 
     for(int i = 0; i < len - 1; i++) { 
      sb.append(array[i] + ", "); 
     } 
     sb.append(array[(int) (len - 1)] + " ]"); 
     return sb.toString(); 
    } 

    public static double[] mergeSort(double[] array) { 

     if (array.length <= 1) { 
      return array; 
     } 
     int half = array.length/2; 
     return merge(mergeSort(Arrays.copyOfRange(array, 0, half)), 
       mergeSort(Arrays.copyOfRange(array, half, array.length))); 
    } 

    private static double[] merge(double[] ds, double[] ds2) { 
     int len1 = ds.length, len2 = ds2.length; 
     int totalLength = len1 + len2; 
     double[] result = new double[totalLength]; 
     int counterForLeft =0,counterForRight=0,resultIndex=0; 
     while(counterForLeft<len1 || counterForRight < len2){ 
      if(counterForLeft<len1 && counterForRight < len2){ 
       if(ds[counterForLeft]<= ds2[counterForRight]){ 
        result[resultIndex++] =(int) ds[counterForLeft++]; 
       } else { 
        result[resultIndex++] =(int) ds2[counterForRight++]; 
       } 

      }else if(counterForLeft<len1){ 
       result[resultIndex++] = (int) ds[counterForLeft++]; 

      }else if (counterForRight <len2){ 
       result[resultIndex++] =(int) ds2[counterForRight++]; 
      } 
     } 
     return result; 
    } 

    private static double[] getIntArray() { 
     double[] array = new double[10000]; 
     Random random = new Random(); 
     for(int i = 0; i < 10000; i++) { 
      array[i] = (random.nextDouble() * .99999); 

     } 

     return array; 
    } 
} 

Antwort

1

Im Verschmelzungsverfahren wird, wenn von einem Kopier die Eingabefelder zu den Ergebnissen, werfen Sie int. zum Beispiel:

result[resultIndex++] =(int) ds[counterForLeft++]; 

Alle Ihre Doppelzimmer liegen im Bereich [0 ... 1), so das Ergebnis einer der Casting m zu int ist Null. Werden Sie diese Würfe einfach los, und Sie behalten Ihre Zahlen im Zusammenführungsergebnis.

Als zusätzlichen Tipp ist es viel einfacher, kleine Probleme zu debuggen als große. Es war für jede Größe größer als 2, so sollten Sie mit Größe 2, nicht 10000 debuggen.

+0

Wow, das total von mir verrutscht Vielen Dank! Habe das einfach hinzugefügt und es hat funktioniert. –

+0

Wie würde ein Test für diesen Code aussehen, testen Sie wie in der Bestätigung, dass das nächste Double in der Zeichenfolge ist? Wenn es Ihnen nichts ausmacht zu helfen, ich bin irgendwie verloren, ich denke, mit .compateTo zu testen ist der richtige Weg, um darüber zu gehen. –

+0

@Tomlangdorr Wenn Sie wissen, dass alle Eingaben endliche Zahlen sind, können Sie einen einfachen Doppelvergleich verwenden. –