【问题标题】:c# - Binary search algorithm random generated array items not workingc# - 二分搜索算法随机生成的数组项不起作用
【发布时间】:2023-03-11 14:24:01
【问题描述】:

我在 C# 的控制台窗口应用程序中实现了二进制搜索算法。我正在为数组生成随机值并分别使用Random()Array.Sort() 函数对它们进行排序。

问题 - 无论我给出什么 Key(要在数组中搜索的项目),程序都会返回 Key not found 使用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;
    }
  }
}

如果我在上面的代码中犯了任何愚蠢的错误或犯了错误,请告诉我。任何帮助都会非常有帮助。

【问题讨论】:

    标签: c# .net arrays algorithm random


    【解决方案1】:

    此评论太短,因此添加了答案以显示如何设置 basicOperations 并仍然返回搜索位置。您将basicOperations 声明为out 参数,这意味着方法可以更改它,以便调用者在方法返回时可以看到它。

    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;
    

    【讨论】:

      【解决方案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]);
              }
      

      这将显示实际生成的值。

      【讨论】:

      • 感谢@CollBots 指出错误 :) 非常感谢您的帮助 :)
      【解决方案3】:

      据我所知,您的搜索代码运行良好。但是,当您列出随机数组的内容时,您应该写 arr[i] 而不是 i 以查看数组中的内容,以便您可以在其中选择搜索值。或者,将arr[x] 作为搜索项传递。它应该返回x

      【讨论】:

      • 我必须承认,在调试之前我也没有看到它!
      • 是的,我也没有太在意。我对此感到头疼,现在我很高兴知道答案。
      • 嗨@John D。我可以再问你一个问题吗?我已经编辑了上面的代码来计算算法的基本操作。我在算法的开头和结尾添加了增量,并返回了 basicOperations 的值。如何在输出中显示 basicOperations 的值?我应该在上面的代码中在哪里添加Console.WriteLine("Basic Operations {0}", basicOperations); 行?
      • 尝试将变量basicOps 作为out 参数传入。整数运算; int searchPos = IntArrayBinarySearch(arr, arr[5], out basicOps); Console.WriteLine("发现于 {0} num ops={1}", searchPos, basicOps);
      • 非常感谢@John D,太好了!非常感谢您的帮助:)
      猜你喜欢
      • 2020-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 2017-07-02
      • 2020-03-22
      • 2018-02-05
      • 1970-01-01
      相关资源
      最近更新 更多