基本算法连载(1)-顺序搜索与二分搜索

顺序搜索
Programmer每天都碰到顺序搜索,其code snippet:


/*
* 顺序遍历数组,搜索v值是否存在。如果存在,返回相应的位置索引,
* 否则返回-1
*/

int  sequentialSearch( int  a[], int  v, int  l, int  r) {
int i;
for(i = l;i <= r;i++){
if(v == a[i])
return i;
}

return -1;
}

分析:

 

  1. 假设数组拥有N个元素,对于不成功的搜索,总是搜索N个元素;对于成功的搜索,平均搜索次数为N/2。
  2. 假设每个数组元素被搜索到的概率相等,那么平均搜索次数可以这样计算:(1+2+...+N)/N = (N+1)/2
  3. 对于排序数组,相关性质不变。

二分搜索
code snippet:
/*
* 二分搜索,非递归实现
* 假设:数组元素已经按序排列
*/

int  binarySearch( int  a[], int  v, int  l, int  r) {
int m;
while(l<=r){
= (l+r)/2;
if(v == a[m])
return m;

if(v > a[m]){
= m + 1;
}
else{
= m - 1;
}

}

return -1;
}


/*
* 二分搜索,递归实现
*/

// dataForExperiment数组定义及初始化
int  binarySearch( int  v, int  l, int  r) {
if(l > r){
return -1;
}

int m = (l + r)/2;
if(v == dataForExperiment[m]){
return m;
}
else{
if(v > dataForExperiment[m]){
return binarySearch(v,m+1,r);
}
else{
return binarySearch(v,l,m-1);
}

}

}

分析:
  1. 假设Tn表示在最坏情况下二分搜索需要比较的次数,那么有Tn=Tn/2+1,其中n>=2,T1=1
  2. 求解递归式,可以得到二分搜索检查元素个数永远不超过lgn+1。
  3. 数组必须是已经排好序的。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值