如果二进制搜索需要预先对数组进行排序,为什么以下代码有效?
string[] strings = new[] { "z", "a", "y", "e", "v", "u" };
int pos = Array.BinarySearch(strings, "Y", StringComparer.OrdinalIgnoreCase);
Console.WriteLine(pos);
为什么这段代码会返回-1?
public class Person : IComparable<Person> {
public string Name { get; set; }
public int Age { get; set; }
public int CompareTo(Person other) {
return this.Age.CompareTo(other.Age) + this.Name.CompareTo(other.Name);
}
}
var people = new[] {
new Person { Age=5,Name="Tom"},
new Person { Age=1,Name="Tom"},
new Person { Age=2,Name="Tom"},
new Person { Age=1,Name="John"},
new Person { Age=1,Name="Bob"},
};
var s = new Person { Age = 1, Name = "Tom" };
// returns -1
Console.WriteLine(
Array.BinarySearch(people, s)
);
答案 0 :(得分:2)
如果违反the pre-condition(“数组的元素必须已根据comparer定义的排序顺序按递增值排序;否则,结果可能不正确。”),导致未定义的行为,有时包括,“嘿,它看起来有效。”在免费和许多其他编程错误之后使用也是如此。
我并不感到惊讶它适用于那个输入,因为“y”和“e”都是同样的中间元素。它使用匹配的中间的“y”。如果您尝试:
string[] strings = new[] { "z", "a", "y", "e", "e", "v", "u" };
你会发现这不起作用。请注意,元素数量奇数。目标在中间之前,而应该在之后。