如何在排序数组中定位一个点?
How to locate a point in a sorted array?
比如我有一个排序数组(网格点):0,1,2,3,4,5
然后我尝试定位 3.3 的位置。它位于元素 3 和 4 之间,因此结果应该是元素 3 的索引,即 3。有什么方法可以做到吗?
您可以使用 List<T>
或 Array
的默认 BinarySearch
方法,但如果未找到完全匹配项,如何获取最接近元素的索引并不是立即显而易见的。为此,您需要这样做:
var list = new float[] { 0, 1, 2, 3, 4, 5 };
var idx = Array.BinarySearch(list, 3.3f);
if (idx < 0)
idx = ~idx;
如果未找到直接匹配项,方法 returns 负数,在应用 ~ 运算符后,为您提供比您的 更大 的下一项的索引搜索。在您的情况下,它将是“4”,因此索引是“4”。要获得比您搜索的内容 更小 的最接近的项目 - 只需减去 1(注意索引可能变为 -1,因此会超出数组的范围)。另请注意,如果目标元素大于数组中的所有元素 - 它(在应用 ~ 运算符之后)将 return 索引超出数组边界(索引等于数组长度)。另请注意 array\list 必须已经排序 - 这些方法不会为您排序。
比如我有一个排序数组(网格点):0,1,2,3,4,5
然后我尝试定位 3.3 的位置。它位于元素 3 和 4 之间,因此结果应该是元素 3 的索引,即 3。有什么方法可以做到吗?
您可以使用 List<T>
或 Array
的默认 BinarySearch
方法,但如果未找到完全匹配项,如何获取最接近元素的索引并不是立即显而易见的。为此,您需要这样做:
var list = new float[] { 0, 1, 2, 3, 4, 5 };
var idx = Array.BinarySearch(list, 3.3f);
if (idx < 0)
idx = ~idx;
如果未找到直接匹配项,方法 returns 负数,在应用 ~ 运算符后,为您提供比您的 更大 的下一项的索引搜索。在您的情况下,它将是“4”,因此索引是“4”。要获得比您搜索的内容 更小 的最接近的项目 - 只需减去 1(注意索引可能变为 -1,因此会超出数组的范围)。另请注意,如果目标元素大于数组中的所有元素 - 它(在应用 ~ 运算符之后)将 return 索引超出数组边界(索引等于数组长度)。另请注意 array\list 必须已经排序 - 这些方法不会为您排序。