二分搜索不会返回正确的索引

时间:2018-03-10 12:57:59

标签: c# arrays bisection

我想搜索数组中给定整数的索引。如果给定数组中的数字不重复,代码就会起作用,例如,如果我们在int [] array = new int [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]中搜索整数2的索引,但是如果给定的数组是,例如,int [] array = new int [1, 2, 2, 4, 5, 6, 7, 8, 9, 10, 11],代码将返回索引2,而不是1。

public static int Bisection(int[] array, int element)
{
    int left = 0;
    int right = array.Length - 1;
    int middle = (left + right) / 2;

    while (array[middle] != element)
    {
        if (array[middle] < element)
        {
            left = middle + 1;
        }
        else
        {
            right = middle - 1;
        }
        middle = (left + right) / 2;


        if (right < left)
        {
            return -1;
        }
    }
    return middle;
}

所以我的问题是,如果数组中有多个相同的整数,我应该怎么做才能返回整数的最低索引?

2 个答案:

答案 0 :(得分:1)

您可以使用LINQ解决此问题。以下代码搜索array中与element匹配的第一个号码,返回array中的索引:

int[] array = { 1, 2, 2, 4, 5, 6, 7, 8, 9, 10, 11 };
int element = 2;
var result = Enumerable.Range(0, array.Length).FirstOrDefault(i => array[i]==element);

如果您希望array中与element匹配的所有数字的索引:

var result = Enumerable.Range(0, array.Length).Where(i => array[i]==element).ToArray(); 

答案 1 :(得分:1)

检查一下:

public static int Bisection(int[] array, int element)
{
    int left = 0;
    int right = array.Length - 1;
    int middle = (left + right) / 2;

    while (array[middle] != element || (middle > 0 && array[middle - 1] == element))
    {
        if (array[middle] < element)
        {
            left = middle + 1;
        }
        else
        {
            right = middle - 1;
        }
        middle = (left + right) / 2;


        if (right < left)
        {
            return -1;
        }
    }
    return middle;
}

while条件已更改。