2016-05-19 21 views
1

例如,我有一個排序數組(網格點):0,1,2,3,4,5如何找到排序數組中的點?

我試圖找到3.3的位置。它位於元素3和元素4之間,因此結果應該是元素3的索引,它是3.任何要做到這一點的方法?

+1

因爲數組已排序,所以可以執行二分搜索。這裏的訣竅是首先「發佈」()該數字。 –

+0

順便說一句,Array和List 都有BinarySearch方法。 – Evk

回答

4

您可以使用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; 

如果沒有直接找到匹配,方法返回負數其中,運用〜運營商之後,給你下一個項目的指數比你搜索什麼大對於。在你的情況下,這將是「4」,所以索引是「4」。爲了得到最接近的項目比你搜索的要小 - 只需減1(注意索引可以變成-1然後等於數組邊界之外)。還要注意,如果目標元素大於數組中的所有元素 - 它(在應用〜運算符後)將返回數組邊界外的索引(索引等於數組長度)。還要注意array \ list必須已經排序 - 這些方法不會爲你排序。

相關問題