2017-10-24 1 views
0

Ihr Zweck besteht darin, die Anzahl der Vergleiche zwischen den Schlüsseln und den Array-Elementen zurückzugeben. Bitte lassen Sie mich wissen, wenn es etwas gibt, das ich ändern sollte, da ich neu in Java bin und mit Best Practices noch nicht vertraut bin.Funktionieren meine Java Binary und Linear Search Algorithmen richtig?

public class BinaryVsLinear { 

private static int linearSearch(int key, int[] array){ 
    int count = 0; 
    for (int i = 0; i < array.length; i++){ 
     count++; 
     if (array[i] == key){ 
      i += array.length +1; 
     } 
    } 
    return count; 
} 

private static int binarySearch(int key, int[] array){ 

    int count = 0, l = 0, r = array.length -1; 
    while (l <= r){ 
     int m = (l+r)/2; 
     count++; 
     if (array[m] == key){ 
      return count; 
     } 
     count++; 
     if (array[m] < key){ 
      l = m + 1; 

     } 
     else{ 
      r = m - 1; 
     } 
    } 
    return count; 
} 
+0

Ist die Eingabe für beide sortiert? Ihre binäre Suche funktioniert nur bei sortierten Daten, und die lineare Suche kann beschleunigt werden, wenn sie an sortierten Daten arbeitet (versuchen Sie, beim array [i]> key zurückzukehren) – phflack

+0

Ja, die Eingabe für beide ist sortiert. –

Antwort

0

Ihr Code ist korrekt, d. H. Er zählt, wie viele Vergleiche sowohl für lineare als auch für binäre Suchvorgänge ausgeführt werden. Da Sie ein Neuling sind, würde ich einige bessere Praktiken empfehlen, wenn Sie Code schreiben, werfen Sie einen Blick darauf.

public class BinaryVsLinear { 

    private static int linearSearch(int key, int[] array) { 

     int count = 0; 

     for (int i = 0; i < array.length; i++){ 
      count++; 
      if (key == array[i]){ 
       break; 
      } 
     } 

     return count; 

    } 

    private static int binarySearch(int key, int[] array) { 

     // one variable per line 
     // use better names 
     int count = 0; 
     int left = 0; 
     int right = array.length -1; 

     while (left <= right){ 

      int middle = (left + right)/2; 

      count++; 
      if (array[middle] == key){ 
       return count; 
      } 

      count++; 
      if (key > array[middle]){ 
       left = middle + 1; 
      } else{ 
       right = middle - 1; 
      } 

     } 

     return count; 

    } 

} 

Ich habe einige Räume, um besseren Namen einige Variablen-Namen zu ändern, usw. Es ist eine Frage der Präferenz ist, aber man muss immer die Aufmerksamkeit auf die Lesbarkeit des Codes zahlen.

+0

Persönliche Präferenz/Unternehmenspolitik wird dies diktieren, aber persönlich mag ich Brüche und Mehrfachrenditen stark. Dieser Artikel '[Single-Entry, Single-Exit (SESE) Heuristik] (http://ianjoyner.name/No_return.html)' von Ian Joyner fasst meine Gedanken dazu zusammen. –

+0

@ d.j.brown 'Persönliche Präferenz/Firmenpolitik wird dies diktieren 'yep – davidbuzatto

+0

@ d.j.brown wie würden Sie empfehlen, die Pause zu ändern? –