题目1:经典算法—二分查找
折半查找的基本思想:减小查找序列的长度,分而治之的进行关键字的查找。该序列必须是有序的。
查找过程是:在有序表中,取中间的记录作为比较关键字,若给定值与中间记录的关键字相等,则查找成功;若给定的值小于中间记录的关键字,则在中间记录的左半区间继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区间继续查找;不断重复这个过程,直到查找成功。否则查找失败
实现:通常设置3个指针:low、high、mid。假设序列(数组)是从小到大排序。如果数组是从大到小排序,只需要改一些代码即可,思想不变。
Code:
int BinSearch(int* array, int n, int key)
{
int low = 0, high = n-1, mid;
while (low <= high)
{
mid = (low + high) / 2;
if (array[mid] == key)
{
return mid;
}
else if (key > array[mid])
{
low = mid +1;
}
else
{
high = mid - 1;
}
}
return -1;
}
实际上,二分查找的过程可以绘制成一棵二叉树,每次二分查找的过程就相当于把原来的树划分为两棵子树,所以每次二分之后下次就只需要查找其中一半的数据就可以了。那么二分查找算法的时间复杂度是多少呢?在最好的情况下,只需要查找一次就可以了,因为这时候中间记录的关键字与要查找的key是相等,自然一次就够了。在最坏的情况下是从根节点查找到最下面的叶子结点,这个过程需要的时间复杂度是O(logn)。
需要注意的是,虽然二分查找算法的效率很高(这也是二分查找算法被广泛应用的原因),但是仍然是有使用条件的:有序。就