c# - 如何在排序数组中定位一个点?

标签 c# sorting binary-search

比如我有一个排序数组(网格点):0, 1, 2, 3, 4, 5

然后我尝试定位 3.3 的位置。它位于元素 3 和 4 之间,因此结果应该是元素 3 的索引,即 3。有什么方法可以做到吗?

最佳答案

您可以使用默认的 BinarySearch List<T> 之一的方法或 Array ,但如果没有找到完全匹配项,如何获取最接近元素的索引并不是立即显而易见的。为此,您需要这样做:

var list = new float[] { 0, 1, 2, 3, 4, 5 };
var idx = Array.BinarySearch(list, 3.3f);
if (idx < 0)
    idx = ~idx;

如果未找到直接匹配项,方法将返回负数,在应用 ~ 运算符后,它会为您提供比您搜索的内容更大的下一项的索引。在您的情况下,它将是“4”,因此索引是“4”。要获得比您搜索的内容更小的最接近的项目 - 只需减去 1(注意索引可能变为 -1,因此会超出数组的范围)。另请注意,如果目标元素大于数组中的所有元素 - 它(在应用 ~ 运算符之后)将返回数组边界之外的索引(索引等于数组长度)。另请注意,array\list 必须已经排序 - 这些方法不会为您排序。

关于c# - 如何在排序数组中定位一个点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37333310/

相关文章:

c# - C# 中对文本框的异步写入被覆盖

c# - 试图制作一个二维列表数组

c - 如何在线性时间内对 int 数组进行排序?

python - 使用python排序的词频计数

c++ - 二进制搜索给出的结果略有不准确

c# - 无需等待的任务异常处理

c# - 匹配不以空格开头或结尾的字符串的正则表达式

php - 从数据库检索 VAR CHAR 列的 Order By 时分割数据的函数

java - 我怎样才能使选择升序和降序问题防错?

c++ - 将元素插入排序数组并找到其索引的最有效方法