一.顺序搜索(Linear search)
对于一个n元数组,查找某一元素是否等于x,则需要将数组从头到尾与x做判断,运气好的话,可能比较第一次就找到,运气坏的话可能最后一个元素才找到或者都没找不到,即元素比较次数是1~n之间。
输入:n个元素的数组A[1...n]和元素x
输出:如果x=A[j],1≤j≤n,则输出j,否则输出0
j<-1
while (j<n) and (x≠A[j])
j<-j+1
end while
if x=A[j] then return j else return 0
二.二分搜索(Binary search)
令A[low...high]为元素按升序排列的非空数组,A[mid]为中间元素,假定x>A[mid]且在A中,则它必在A数组的右半集合中,接下来只需在A[mid+1...high]中搜索x,A[low...mid]被丢弃掉。循环搜索,直至找到x。
low<-1, high<-n, j<-0
while (low≤high) and (j=0)
mid<-(low+high)/2(取下整)
if x=A[mid] then j<-mid
else if x<A[mid] then high<-mid-1
else low<-mid+1
end while
return j
对于一个大小为n的排序数组,算法二分查找执行比较的最大次数为。
证明过程:
整个搜索过程是都有元素折半的操作,第一次比较后,丢弃一半的元素,第二次比较再丢弃一半的一半的元素,直至结束。即,
第一次循环开始时元素的个数;
第二次循环开始时元素的个数;
第三次循环开始时元素的个数
第j次循环开始时元素的个数......
当=1时,算法结束,则j表示二分查找的最大比较次数,即时结束算法,化简得,则,得证。