2016-05-15 26 views
0

我在C#中的控制檯窗口應用程序中實現了二進制搜索算法。我正在爲數組生成隨機值並分別使用Random()Array.Sort()函數對它們進行排序。c# - 二進制搜索算法隨機生成的數組項不工作

的問題 - 無論什麼重點(數組中要搜索的項目),我給,該程序將返回未找到鍵在使用Random功能

產生的數組項

如果我使用Console.ReadLine()手動輸入數組元素,則不會發生這種情況。

TLDR:當手動輸入數組項二進制搜索算法工作正常,但當陣列項目,採用Random函數來產生不起作用。

任何人都可以指出我在做什麼錯誤?

我的代碼 - 隨機生成的數組項。

namespace BSA 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     var arr = new int[10]; 

     Random rnd = new Random(); 

     for (int i = 0; i < arr.Length; i++) 
     { 
      arr[i] = rnd.Next(1, 1000); 
     } 

     Array.Sort(arr); 

     for (int i = 0; i < arr.Length; i++) 
     { 
      Console.Write("{0}\n", i); 
     } 

     while (true) 
     { 
      Console.WriteLine("Enter the number to be searched in the array."); 

      var searchItem = Convert.ToInt32(Console.ReadLine()); 

      var foundPos = Search(arr, searchItem); 

      if (foundPos > 0) 
      { 
       Console.WriteLine("Key {0} found at position {1}", searchItem, foundPos); 
      } 
      else 
      { 
       Console.WriteLine("Key {0} not found", searchItem); 
      } 
     } 
    } 

    public static int Search(int[] arr, int item) 
    { 
     var min = 0; 
     var N = arr.Length; 
     var max = N - 1; 
     int basicOperations = 0; 

     basicOperations++; 
     do 
     { 
      var mid = (min + max)/2; 

      if (arr[mid] == item) 
       return mid; 

      if (item < arr[mid]) 
       max = mid - 1; 
      else 
       min = mid + 1; 

      basicOperations++; 
     } while (min <= max); 

     return basicOperations; 
    } 
    } 
} 

請讓我知道,如果我做任何愚蠢的錯誤或我犯在上面的代碼中的錯誤。任何幫助都會非常有幫助。

回答

2

根據我的看法,您的搜索代碼工作正常。但是,當您列出隨機數組的內容時,應該編寫arr[i]而不是i以查看數組中的內容,以便您可以在其中選擇一個搜索值。或者,將arr[x]作爲搜索項目。它應該返回x

+0

謝謝@約翰d您指出的錯誤:) – Dazzler

+0

我必須承認,我沒有看到它,直到我調試它! –

+0

是的,我也沒有太注意。我對此感到懊惱,現在很高興知道答案。 – Dazzler

2

您的代碼正常工作。你只是沒有找到正確的鑰匙。該打印生成到數組中的值的函數打印循環計數器代替:

 for (int i = 0; i < arr.Length; i++) 
     { 
      Console.Write("{0}\n", i); 
     } 

您需要將其更改爲:

 for (int i = 0; i < arr.Length; i++) 
     { 
      Console.Write("{0}\n", arr[i]); 
     } 

這將顯示實際產生的值。

+0

謝謝@CollBots指出錯誤:)真的很感謝你的幫助:) – Dazzler

1

評論太短,爲此添加的答案顯示如何設置basicOperations並仍返回搜索位置。您聲明basicOperationsout參數,這意味着該方法可以更改它,以便調用方可以在方法返回時看到它。

public static void Main(string[] args) 
{ 
    ... ... ... 
    int basicOperations; 
    int searchPos = IntArrayBinarySearch(arr, arr[5], out basicOperations); 
    Console.WriteLine("Found at {0} basic ops={1}", searchPos, basicOperations); 
} 

public static int IntArrayBinarySearch(int[] data, int item, out int basicOperations) 
{ 
    var min = 0; 
    var N = data.Length; 
    var max = N - 1; 
    basicOperations = 0; 

    basicOperations++; 

,並在底部,你並不需要返回out參數,只是返回-1表示失敗像之前

return -1; 
+0

明白了,完美的工作:) – Dazzler