上述代码的输出结果如下: True 如果将第2行中x的值改为25,则输出结果如下: False
- a=[1, 2, 3, 4, 5, 6, 8, 20, 24, 31, 35]
- x=24
- def sequentialSearch(a,n):
- pos = 0
- found = False
- while pos < len(a) and not found:
- if a[pos] == n:
- found = True
- else:
- pos=pos+1
- return found
- print(sequentialSearch(a, x))
分析上面的程序,如果数据项不在列表里,唯一的判定办法就是把全部项逐个比较一番。如果表中有 n 个数据,顺序查找就需要 n 次比较。但是分析没有这么简单,有三种情形可能发生:最好的情况下,第一个项就是我们要找的,只有 1 次比较。最差的情况下,需要 n 次比较,全部比较过之后才知道找不到。在平均情况下,会发现是列表的一半,即平均要比较 n/2 次。 假如表中数据项以某种方式排序了,怎样来快速查找呢?下面来介绍折半查找,也就是二分法查找。
(2) 折半查找 算法:设n个有序数(从小到大)存放在数组a[1]----a[n]中,要查找的数为x。用变量low、high、middle 分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间,middle=( low+high)//2,折半查找的算法如下: ① x=a[middle],则已找到退出循环,否则进行下面的判断; ② x<a[middle],x必定落在low和middle -1的范围之内,即high= middle -1; ③ x>a[middle],x必定落在middle +1和high的范围之内,即low= middle +1; ④ 在确定了新的查找范围后,重复进行以上比较,直到找到或者low<=high。 将上面的算法写成如下函数,若找到则返回该数所在的下标值,没找到则返回-1。
(2) 折半查找
上述代码的输出结果如下: find failed -1 如果将第2行改为x=24,则代码的输出结果如下: find it 9
- a=[1, 2, 3, 4, 5, 6, 8, 20, 24, 31, 35]
- x=24
- def binary_Search(a,n):
- low = 0
- high = len(a)-1
- while low <= high:
- middle = (low+high)//2
- if a[middle] == n:
- print('find it')
- return middle+1
- elif a[middle] < n:
- low = middle + 1
- else:
- high = middle - 1
- print('find failed')
- return -1
- print(binary_Search(a,x))