C#中的通用二进制搜索

时间:2010-10-18 23:38:47

标签: c# algorithm

以下是我的通用二进制搜索。它适用于整数类型数组(它会找到其中的所有元素)。但是当我使用字符串数组来查找任何字符串数据时会出现问题。它可以运行第一个索引和最后一个索引元素,但我找不到中间元素。

Stringarray = new string[] { "b", "a", "ab", "abc", "c" };

public static void BinarySearch<T>(T[] array, T searchFor, Comparer<T> comparer) {

        int high, low, mid;
        high = array.Length - 1;
        low = 0;
        if (array[0].Equals(searchFor))            
            Console.WriteLine("Value {0} Found At Index {1}",array[0],0);
        else if (array[high].Equals(searchFor))
            Console.WriteLine("Value {0} Found At Index {1}", array[high], high);
        else
        {
            while (low <= high)
            {
                mid = (high + low) / 2;
                if (comparer.Compare(array[mid], searchFor) == 0)
                {
                    Console.WriteLine("Value {0} Found At Index {1}", array[mid], mid);
                    break;
                }
                else
                {
                    if (comparer.Compare(searchFor, array[mid]) > 0)
                        high = mid + 1;
                    else
                        low = mid + 1;
                }

            }
            if (low > high)
            {
                Console.WriteLine("Value Not Found In the Collection");
            }
        }                 
    }

4 个答案:

答案 0 :(得分:22)

二进制搜索要求对输入进行排序。 “b,a,ab,abc,c”是如何排序的?它似乎没有按任何明显的排序键排序。如果您尝试搜索未排序的数据,则应使用哈希集,而不是列表中的二进制搜索。

另外,你的中点计算是微妙的错误,因为加上高+低可能会溢出。然后它变为负数,除以2。

对于真实大小的数组来说,这是极不可能的,但完全有可能你有一天会想要使用这个算法来支持使用大整数进行索引的数据类型,比如排序数据的内存映射文件。

编写二进制搜索算法的最佳做法是在计算中点时执行(high - low) / 2 + low,因为它始终保持在范围内。

答案 1 :(得分:1)

这两行是可疑的:

high = mid + 1
low = mid + 1

嗯。看看补偿。当然,这在维基百科上有详细记载Binary Search Algorithm。你也做额外的工作。仔细检查伪代码和示例。

答案 2 :(得分:1)

pst您的建议确实奏效了。 :)这段代码适用于int和string。

    public static int BinarySearch<T>(T[] array, T searchFor, Comparer<T> comparer)
    {
        int high, low, mid;
        high = array.Length - 1;
        low = 0;
        if (array[0].Equals(searchFor))
            return 0;
        else if (array[high].Equals(searchFor))
            return high;
        else
        {
            while (low <= high)
            {                   
                mid = (high + low) / 2;
                if (comparer.Compare(array[mid], searchFor) == 0)                   
                    return mid;                    
                else if (comparer.Compare(array[mid], searchFor) > 0)                    
                    high = mid - 1;                    
                else                    
                    low = mid + 1;                  
            }
            return -1;                
        }                 
    }

答案 3 :(得分:1)

//二进制搜索递归方法

    public void BinarySearch(int[] input,int key,int start,int end)
    {
        int index=-1;
        int mid=(start+end)/2;
        if (input[start] <= key && key <= input[end])
        {
            if (key < input[mid])
                BinarySearch(input, key, start, mid);
            else if (key > input[mid])
                BinarySearch(input, key, mid + 1, end);
            else if (key == input[mid])
                index = mid;
            if (index != -1)
                Console.WriteLine("got it at " + index);
        }
    }  

     int[] input4 = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };   
     BinarySearch(input4, 1, 0, 8);