一、二分查找
排序的重要意义之一,就是为检索带来方便。试想有10^6个整数,你希望确认其中是否包含12345。最容易想到的方法就是把它们放到数组A中,然后依次检查这些整数是否等于12345。这样的方式对于单次询问来说,工作得很好,但如果需要查找10000个数,就需要把整个数组A遍历10000次,而如果事先将数组A排序,就可以查找得更快——就好比在字典中查找单次不必一页一页翻一样。
在有序表中查找元素常常使用二分查找(BinarySearch)。它的基本思路就像是“猜数字游戏”:你在心里想一个不超过1000的正整数,我可以保证在10次之内猜到——只要你每次告诉我猜的数比你想的大一些、小一些,或者正好猜中。
猜的方法就是二分。首先我猜500,除了运气特别好正好猜中以外,不管你说太大还是太小,我都能把可行范围缩小一般:如果太大,那么答案在1-499之间,如果太小,那么答案在501-1000之间。只要每次选择可行区间的中点去猜,每次都可以把范围缩小一半。由于log2(1000) <10所以10次一定能猜得到。
这也是二分查找的基本思路。注意:二分查找只适用于有序序列。
int binarysearch(int *A,int x,int y,int v)
{
int m;
while(x<y)
{
m=x+(y-x)/2;
if(A[m] == v) return m;
else if (A[m] > v) y=m;
else x = m+1;
}
return -1; /**未查找到*/
}
二分查找常常用在一些抽象的场合,没有数组A,也没有要查找的v,但是二分的思想仍然适用。