2016-05-15 57 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