C# 获取二进制搜索以显示数组中的所有重复值
C# Get Binary Search To Display All Duplicate Values In Array
如果我搜索已排序的数组,它只会显示其中一个值,即使数组中有多个相同的值也是如此。我不希望它告诉我有多少重复项,我希望它显示我搜索的数组中的所有重复值。还是我需要使用不同的搜索来执行此操作?
所以如果我有 array1{1,2,3,4,4,5,5,5,5,6} 并且我搜索 5 我希望它输出:
5
5
5
5
这是我的二进制搜索代码。
public class search
{
public static void Main(string[] args)
{
//Arrays are created here. e.g. array1{1,2,3,4,4,5,5,5,5,6}
int Input;
Console.WriteLine("Enter the number you would like to search for.");
Input = Convert.ToInt32(Console.ReadLine());
int y = BinarySearch(array1, Input);
Console.WriteLine("array1 {0} : array2{1} : array3 {2} : array4 {3} : array5 {4}",array1[y], array2[y], array3[y], array4[y], array5[y]);
}
public static int BinarySearch(double[] Array, int Search)
{
int x = Array.Length;
int low = 0;
int high = x - 1;
while (low <= high)
{
while (low <= high)
{
int mid = (low + high) / 2;
if (Search < Array[mid])
{
high = mid - 1;
}
else if (Search > Array[mid])
{
low = mid + 1;
}
else if (Search == Array[mid])
{
Console.WriteLine("{0}", Search);
return mid;
}
}
Console.WriteLine("{0} was not found.", Search);
}
return high;
}
}
当然,您可以为此使用二进制搜索。但是你的代码有点奇怪。因为当您在这里 else if (Search == array[mid]) ...
找到第一个元素时,您会立即从函数中 return 并且再也不会调用它。这就是为什么您只会得到一个结果。
要使其正常工作,当您找到这样的元素时,您需要在数组中通过索引 low ... mid-1 进行搜索,然后通过索引 mid+1 ... high 进行搜索。
这是代码,但我强烈建议您不要只是复制它,也许可以尝试将其重写为 while 循环(每个递归都可以重写为循环)
static void BinarySearch(int[] array, int low, int high, int searchedValue)
{
if (low > high)
return;
int mid = (low + high) / 2;
if (searchedValue < array[mid])
{
high = mid - 1;
BinarySearch(array, low, high, searchedValue);
}
else if (searchedValue > array[mid])
{
low = mid + 1;
BinarySearch(array, low, high, searchedValue);
}
else if (searchedValue == array[mid])
{
Console.WriteLine(array[mid]);
BinarySearch(array, low, mid - 1, searchedValue);
BinarySearch(array, mid + 1, high, searchedValue);
}
}
如果我搜索已排序的数组,它只会显示其中一个值,即使数组中有多个相同的值也是如此。我不希望它告诉我有多少重复项,我希望它显示我搜索的数组中的所有重复值。还是我需要使用不同的搜索来执行此操作?
所以如果我有 array1{1,2,3,4,4,5,5,5,5,6} 并且我搜索 5 我希望它输出:
5
5
5
5
这是我的二进制搜索代码。
public class search
{
public static void Main(string[] args)
{
//Arrays are created here. e.g. array1{1,2,3,4,4,5,5,5,5,6}
int Input;
Console.WriteLine("Enter the number you would like to search for.");
Input = Convert.ToInt32(Console.ReadLine());
int y = BinarySearch(array1, Input);
Console.WriteLine("array1 {0} : array2{1} : array3 {2} : array4 {3} : array5 {4}",array1[y], array2[y], array3[y], array4[y], array5[y]);
}
public static int BinarySearch(double[] Array, int Search)
{
int x = Array.Length;
int low = 0;
int high = x - 1;
while (low <= high)
{
while (low <= high)
{
int mid = (low + high) / 2;
if (Search < Array[mid])
{
high = mid - 1;
}
else if (Search > Array[mid])
{
low = mid + 1;
}
else if (Search == Array[mid])
{
Console.WriteLine("{0}", Search);
return mid;
}
}
Console.WriteLine("{0} was not found.", Search);
}
return high;
}
}
当然,您可以为此使用二进制搜索。但是你的代码有点奇怪。因为当您在这里 else if (Search == array[mid]) ...
找到第一个元素时,您会立即从函数中 return 并且再也不会调用它。这就是为什么您只会得到一个结果。
要使其正常工作,当您找到这样的元素时,您需要在数组中通过索引 low ... mid-1 进行搜索,然后通过索引 mid+1 ... high 进行搜索。
这是代码,但我强烈建议您不要只是复制它,也许可以尝试将其重写为 while 循环(每个递归都可以重写为循环)
static void BinarySearch(int[] array, int low, int high, int searchedValue)
{
if (low > high)
return;
int mid = (low + high) / 2;
if (searchedValue < array[mid])
{
high = mid - 1;
BinarySearch(array, low, high, searchedValue);
}
else if (searchedValue > array[mid])
{
low = mid + 1;
BinarySearch(array, low, high, searchedValue);
}
else if (searchedValue == array[mid])
{
Console.WriteLine(array[mid]);
BinarySearch(array, low, mid - 1, searchedValue);
BinarySearch(array, mid + 1, high, searchedValue);
}
}