二进制搜索List <object> </object>

时间:2014-01-22 02:07:24

标签: c# list methods binary-search

您好我的库需要一些帮助。我正在尝试从我的List<>实现二进制搜索,但它的工作效果不佳。

这是我的图书馆课程。

    private class Library
{
    List<object> library = new List<object>();

    public void AddBook(string bookName, string bookAuthor, int bookIDNum)
    {
        //Add books to the library.
        string bookEntry = bookName + " " + bookAuthor + " " + bookIDNum;
        library.Add(bookEntry);
        library.TrimExcess();
    }

        public void SearchLibrary(string bookName)
    {
        //Searches the library by title
        library.Sort();
        int low = 0;
        int high = library.Count;
        int mid = 0;
        int steps = 0;
        while(!bookName)
        {
            steps++;
            mid = (low + high)/2;
            if(bookName == library[mid])
            {
                return true;
            }
            else if(bookName < library[mid])
            {
                high = mid;
            }
            else
            {
                low = mid;
            }
            if(low > high-1 || high < low+1)
            {
                return false;
            }
        }
    }
}
}

如果我有更好的方法可以制作搜索方法,我将不胜感激,谢谢。

1 个答案:

答案 0 :(得分:3)

如果不对您的算法的详细信息发表评论,您的代码就会出现一些问题。您可以通过查看编译器的错误消息找到所有这些问题。

  • 您返回truefalse,但您的方法指定它返回void。将其更改为bool

    public bool SearchLibrary(string bookName)
    
  • 您执行!bookName,我认为您要检查它是否为null。您必须在C#中明确地执行此操作。

    while (bookName != null)
    
  • 您比较两个字符串,但<运算符不会因字符串而重载。请改用CompareTo

    else if (bookName.CompareTo(library[mid]) < 0)
    
  • 并非所有代码路径都返回值。无论执行何种执行路径,您都必须返回一个值。例如,用这个结束你的方法:

    return false;
    

然后您的算法出现问题:当没有匹配时它会永远运行。由于我怀疑这可能是家庭作业,我将把它留给OP来解决这个问题。


如果这不是一项家庭作业,你可以为自己省去一些麻烦:

List<T>类有一个方法BinarySearch,它使用默认的比较器来比较列表中的对象。

library.Sort();
bool found = (library.BinarySearch(bookName) >= 0);