作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用此二进制搜索代码搜索降序排序的数组。但是,在我对它进行排序并尝试搜索之后,它并没有返回任何结果,只是一个永远不会消失的加载图标,就好像它有一个无限循环一样。我不确定问题出在哪里,因为代码看起来合乎逻辑。
这是4.0框架的aspx,c#。提前致谢!
protected void Button2_Click(object sender, EventArgs e)
{
String item = TextBox1.Text;
int target = Convert.ToInt16(item);
int mid, first = 0, last = mynumbers.Length - 1;
//for a sorted array with descending values
while (first<=last)
{
mid = (first + last) / 2;
if (target < mynumbers[mid])
first = mid + 1;
if (target > mynumbers[mid])
last = mid - 1;
else
Label11.Text = "Target " + item + " was found at index " + mynumbers[mid];
}
最佳答案
Array
类中有二分查找:
int index = Array.BinarySearch(mynumbers, target);
对于降序,这可以通过 ReverseComparer
轻松实现,它很容易写成:
public class ReverseComparer<T> : IComparer<T>
{
public int Compare(T x, T y)
{
return Comparer<T>.Default.Compare(y, x);
}
}
然后:
int index = Array.BinarySearch(numbers, 7, new ReverseComparer<int>());
如果这是一项学术练习并且您必须使用自定义搜索,那么这当然不适用。如果它必须是类的自定义算法,那么问题是您必须在找到时跳出循环,并且索引位于 mid
,而不是 mynumbers[mid]
:
//for a sorted array with descending values
while (first<=last)
{
mid = (first + last) / 2;
if (target < mynumbers[mid])
{
first = mid + 1;
}
if (target > mynumbers[mid])
{
last = mid - 1;
}
else
{
// the index is mid, not mynumbers[mid], and you need to break here
// once found or it's an infinite loop once it finds it.
Label11.Text = "Target " + item + " was found at index " + mid;
break;
}
}
实际上,我可能会设置一个 bool 标志,而不是保持算法的纯净,而不是将查找与输出问题混在一起,这也会让您更容易判断如果您在未找到的情况下退出循环会发生什么:
bool found = false;
//for a sorted array with descending values
while (!found && first<=last)
{
mid = (first + last) / 2;
if (target < mynumbers[mid])
{
first = mid + 1;
}
if (target > mynumbers[mid])
{
last = mid - 1;
}
else
{
// You need to stop here once found or it's an infinite loop once it finds it.
found = true;
}
}
Label11.Text = found
? "Item " + item + " was found at position " + mid
: "Item " + item + " was not found";
关于c# - 排序数组的二分查找,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8067643/
我正在尝试编写一个程序,在名为 items 的数组中进行顺序搜索和二分搜索,该数组具有 10000 个已排序的随机 int 值。第二个名为 targets 的数组加载了 1000 个 int 值(50
当我尝试使用图表并为其编写一些代码但没有成功时,我遇到了一个问题:/!! 我想创建一些东西来获取图形数据并检查它是否:1- 连接2-二分法3-有循环4-是一棵树 所以我想知道,例如,是否可以将其写入以
我是一名优秀的程序员,十分优秀!