2016-07-31 12 views
1

ソートされた配列を検索すると、配列に同じ値が複数存在する場合でも値のいずれかが表示されます。私はそこに重複がいくつあるのか教えたくないので、私が探している配列に重複した値をすべて表示したい。または、これを行うために使用する必要がある別の検索がありますか?C#バイナリ検索で配列内の重複する値をすべて表示する

私が配列1 {1,2,3,4,4,5,5,5,5,6}を持っていると私は5を検索した場合ので、私は出力にそれをしたい:

5 
5 
5 
5 

これは、バイナリ検索で私のコードです。

public class search 
    { 
    public static void Main(string[] args) 
    { 
     //Arrays are created here. e.g. array1{1,2,3,4,4,5,5,5,5,6} 

     int Input; 

    Console.WriteLine("Enter the number you would like to search for."); 
    Input = Convert.ToInt32(Console.ReadLine()); 
    int y = BinarySearch(array1, Input); 
Console.WriteLine("array1 {0} : array2{1} : array3 {2} : array4 {3} : array5 {4}",array1[y], array2[y], array3[y], array4[y], array5[y]); 
}  

public static int BinarySearch(double[] Array, int Search) 
     { 
      int x = Array.Length; 
     int low = 0; 
     int high = x - 1; 

     while (low <= high) 
     { 
      while (low <= high) 
      { 
       int mid = (low + high)/2; 
       if (Search < Array[mid]) 
       { 
        high = mid - 1; 
       } 
       else if (Search > Array[mid]) 
       { 
        low = mid + 1; 
       } 
       else if (Search == Array[mid]) 
       { 
        Console.WriteLine("{0}", Search); 
        return mid; 
       } 
      } 
      Console.WriteLine("{0} was not found.", Search); 
     } 
     return high; 
     } 
} 
+0

あなたは 'return'文を持っている。ここ

はコードですが、私は強く、まさにそれをコピーして、多分しばらくループにこれを書き換えるしようとすることができない助言します最初の試合で –

答えて

0

確かに、これにはバイナリ検索を使用できます。しかし、あなたのコードはちょっと奇妙です。ここで最初の要素を見つけたら、else if (Search == array[mid]) ...はすぐに関数から戻り、決して再び呼び出さないためです。そういうわけで、結果は1つだけです。

このような要素を見つけたら、インデックスlow ... mid-1、次にインデックスmid> 1 ... highで配列を検索する必要があります。 (すべての再帰をループのように書き換えることができる)

static void BinarySearch(int[] array, int low, int high, int searchedValue) 
    { 
     if (low > high) 
      return; 
      int mid = (low + high)/2; 
      if (searchedValue < array[mid]) 
      { 
       high = mid - 1; 
       BinarySearch(array, low, high, searchedValue); 
      } 
      else if (searchedValue > array[mid]) 
      { 
       low = mid + 1; 
       BinarySearch(array, low, high, searchedValue); 
      } 
      else if (searchedValue == array[mid]) 
      { 
       Console.WriteLine(array[mid]); 
       BinarySearch(array, low, mid - 1, searchedValue); 
       BinarySearch(array, mid + 1, high, searchedValue);    
      }    
    }