class Data { public int id; public string Name; } class Program { static Dictionary<int,Data> list; static void Main(string[] args) { list = new Dictionary<int, Data>(); for (int i = 1; i <= 100; i++) { Data data = new Data(); data.id = i; data.Name = "Name" + i; list.Add(i,data); } while (true) { Console.WriteLine("输入你要查找的数字"); string input = Console.ReadLine(); int num; Int32.TryParse(input, out num); int index = searchNum(num, 1, list.Count); Console.WriteLine(index); } } static int searchNum(int value, int from, int to) { int result = -1; int temp = (int)Math.Floor((double)(from + to) / 2); if (temp < 1 || temp > list.Count) { return -1; } //获取中间元素的值 int tempVal = list[temp].id; if (tempVal == value) { return temp; } if (from == to) {//找不到 return -1; } if (tempVal > value) { result = searchNum(value, from, temp-1); } if (tempVal < value) { result = searchNum(value, temp+1, to); } return result; } }
运行时间为:O(log(n))
对于一个已经排好序的列表,使用中间值的方式来比较值
如果小了,就往左边查找,缩小一半的范围
同样的这样循环,一直对半缩小范围,直到查找到值或找不到(范围内只有一个值了)