活动地址:CSDN21天学习挑战赛
一、折半查找算法
1、基本思路
折半查找,也称二分查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。
在折半查找之前对查找表按照所查的关键字进行排序的意思是:若查找表中存储的数据元素含有多个关键字时,使用哪种关键字做折半查找,就需要提前以该关键字对所有数据进行排序。
2、算法流程
1)输入
待查元素key
n个数的有序序列,以数组为例,默认升序
2)查找过程
核心思想:不断缩小搜索的范围,每次取区间的中心来进行比较
过程如下图所示,low、high、mid分别指向待查区间的下界、上界、中点
待查区间的中心元素与key比较有三种情况:
- 中心元素大于key:待查元素一定在该元素左侧,在左半区间继续查找
- 中心元素等于key:查找成功,直接返回对应的位置
- 中心元素小于key:待查元素一定在该元素右侧,在右半区间继续查找
只要不断重复取中间比较和指定新的搜索区间这两步骤,直到请参见的两个端点重合,表示搜索完毕。
3)输出
查找成功:返回元素所在位置的编号
查找失败:返回-1或自定义失败的标志
3、伪代码
left = 1
right = A.length
while left <= right
mid = (left + right) / 2
if A[mid] == key
return mid
else if A[mid] > key
right = mid - 1
else
left = mid + 1
return -1
二、算法实现
1、基本算法实现
c语言实现
#include <stdio.h>
#include <stdlib.h>
//折半查找,又称为二分查找 ,条件保证要好排序的,不适合应用在频繁的插入操作,因为会打乱顺序
int Binary_Search(int *a,int n,int key)
{
int low,high,mid;
low = 0; //定义最低下标为记录首位
high = n; //记录最高下标为记录末位
while ( low <= high )
{
mid = (low + high) / 2;
if (key < a[mid]) {
high = mid - 1;//最高位下标调小 一位
else if(key > a[mid])
low = mid + 1; //最低下标调整到中位下标大一位
else
return mid;
}
return -1; //没有找到返回-1
}
void main()
{
int a[] = {1,2,3,4,5,6,7,8,9,10};
int index;//下标
index = Binary_Search(a, sizeof(a) / sizeof(int),8);
if (index == -1)
printf("没有找到");
else
printf("找到了,index为:%d",index);
}
2、时间性能分析
1)最好的情况
第一次找到key,时间复杂度:O(1)
2)最坏的情况
最后一次找到key或查找失败,时间复杂度:O(log2n)(以2为底)
3)平均情况
时间复杂度:O(log2n)(以2为底)