我的代码出现逻辑错误

时间:2009-01-16 20:43:21

标签: c# search

我写了这段代码并且它总是显示相同的结果为什么? 代码是一种搜索方法。

using System;
using System.Collections.Generic;
using System.Text;

namespace CArraySe
{
    class Program
    {
        class CArray
        {
            private int[] arr;
            private int upper;
            private int numElements;
            private int compCount;

            public CArray(int size)
            {
                arr = new int[size];
                upper = size - 1;
                numElements = 0;
                compCount = 0;
            }

            public void Insert(int item)
            {
                arr[numElements] = item;
                numElements++;
            }

            public void DisplayElements()
            {
                for (int i = 0; i <= upper; i++)
                {
                    Console.Write(arr[i]);
                    if (i == upper)
                    {
                        Console.WriteLine();
                        continue;
                    }
                    Console.Write(", ");
                }
            }

            public void Clear()
            {
                for (int i = 0; i <= upper; i++)
                    arr[i] = 0;
                numElements = 0;
            }
            public bool SeqSearch(CArray n, int sValue)
            {
                for (int index = 0; index < n.upper; index++)
                {
                    if (arr[index] == sValue)

                        return true;
                }

                compCount++;
                return false;
            }
            public int binSearch(CArray n, int value)
            {
                int upperBound, lowerBound, mid;
                upperBound = n.upper; lowerBound = 0;

                while (lowerBound <= upperBound)
                {
                    mid = (upperBound + lowerBound) / 2;

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

                    else if (value < arr[mid]) upperBound = mid - 1;

                    else lowerBound = mid + 1;
                }
                compCount++;
                return -1;
            }

            static void Main(string[] args)
            {
                CArray nums = new CArray(10);
                Random rnd = new Random(100);
                for (int i = 0; i < 10; i++)
                    nums.Insert((int)(rnd.NextDouble() * 100));

                Console.WriteLine();
                Console.Write("The Binary Search Result is: ");
                Console.WriteLine(nums.binSearch(nums, 500));
                Console.WriteLine(nums.compCount);
                nums.Clear();
                for (int i = 0; i < 10; i++)
                    nums.Insert((int)(rnd.NextDouble() * 100));

                Console.Write("The Sequential Search result is: ");
                Console.WriteLine(nums.SeqSearch(nums, 500));
                Console.WriteLine(nums.compCount);
           }
       }
    }
}

即使我改变了我正在寻找的数字,它也始终显示相同的结果。

输出结果为:

The Binary Search Result is: -1
1
The Sequential Search result is: False
2
Press any key to continue . . .

6 个答案:

答案 0 :(得分:8)

我认为您搜索的值(500)未找到。尝试输出nums数组并验证您要查找的内容是否在数组中。

另外,一个搜索返回一个int而另一个返回一个bool。有具体原因吗?

编辑:此外,Binary Search仅适用于已排序的列表。

答案 1 :(得分:4)

您的方法binSearch在找不到数字时返回“-1”。由于您使用随机值填充数组,因此找不到您搜索的数字的可能性非常大。所以你总是得到“-1”。

要测试你的binSearch方法,你应该使用已知值填充数组,然后搜索一些保证在数组中的值。

答案 2 :(得分:0)

第一个答案是正确的。此外,即使您使用的是随机数,程序的每次运行都会产生相同的随机数序列。如果你想要很好地测试代码,那么每次运行程序时都应该使用不同的数字来播种它。

答案 3 :(得分:0)

正如其他人已经提到的那样,在一般情况下,无法保证您搜索的数字在随机生成的数字列表中。 在您发布的特定情况中,数字将从不出现在列表中,因为您在 0-100 范围内生成随机数,然后试图找到 500

答案 4 :(得分:0)

运行您提供的内容不会添加超过100的值。如果您将添加内容更改为:

        for (int i = 0; i < 9; i++)
            nums.Insert((int)(rnd.NextDouble() * 100));
        nums.Insert(500);

binSearch返回9,但是SeqSearch返回false,因为你的循环搜索是索引&lt; n.upper,你需要做索引&lt; = n.upper来检查所有的值。另外,如上所述,binSearch仅适用于这种情况,因为500大于数组中的所有数字并且已被放置在最后一个索引处。如果列表的搜索未排序,则二进制搜索仅适用于运气。因此改为:

        nums.Insert(500);
        for (int i = 0; i < 9; i++)
            nums.Insert((int)(rnd.NextDouble() * 100));

将返回-1;并且对于SeqSearch来说是真实的。

答案 5 :(得分:0)

虽然这可能没有直接回答你的问题,但这里有一些观察结果会使你的代码难以理解和调试:

  • 您需要numElements或upper中的一个,而不是两个。在Clear()中,您只将numElements设置为0,而您在循环中使用upper?
  • 二进制搜索仅适用于已排序的数组
  • 如果SeqSearch和BinSearch正在接收数组的实例,那么它们不应该是静态方法而不是实例方法吗?