我写了这段代码并且它总是显示相同的结果为什么? 代码是一种搜索方法。
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 . . .
答案 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)
虽然这可能没有直接回答你的问题,但这里有一些观察结果会使你的代码难以理解和调试: