设有一组关键字序列{5,8,14,20,31,55,78,81,93,97,111},使用二分(折半)法查找关键字93需要进行多少次比较()
A. 2
B. 3
C. 4
A. 2
B. 3
C. 4
D. 5
分析:
二分查找基本思想为:在有序序列中,取序列最中间的元素作为比较对象,若给定值与中间记录的关键码相等,则查找成功;若给定值小于中间记录的关键码,则在中间记录的左半边继续查找;若给定值大于中间记录的关键码,则在中间记录右半边区继续查找。不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。
二分查找的时间复杂度是O(log(n)),最坏情况下的时间复杂度是O(n)。
对于本题:首先第一次比较93和最中间的元素55,93>55,然后新的区间为【78,81,93,97,111】
第二次比较新区间最中间的元素93,发现93 = 93,查找成功,返回下标
查找两次,因此选A。
代码实现:python
#-*-coding=UTF-8 -*- s = raw_input().split(',') m = int(raw_input()) s = list(s) #print s def BinarySearch(str, m): count = 0#计数器,记录查找次数 leap = -1#布尔变量,-1表示查找失败 low = 0 high = len(str) - 1 while (low <= high): count += 1#计数器加1,表示新的查找开始 mid = (low + high) / 2 obj = int(str[mid])#因为输入的字符串,首先要转化成整型 if obj < m: low = mid + 1 elif obj > m: high = mid - 1 elif obj == m: print mid leap = 1#查找成功就将leap置1 break#跳出循环,查找结束 print 'Total %d Search(es)' % count if leap == -1: print 'Search No Data' print -1#leap值还是-1表示查找失败 BinarySearch(s,m)
输出示例:
5,8,14,20,31,55,78,81,93,97,111
9
Total 4 Search(es)
Search No Data
-1
5,8,14,20,31,55,78,81,93,97,111
93
8
Total 2 Search(es)
Process finished with exit code 0