前言:
现时各位老铁们对“二分查找折半算法”大致比较珍视,我们都需要知道一些“二分查找折半算法”的相关内容。那么小编也在网上搜集了一些有关“二分查找折半算法””的相关知识,希望朋友们能喜欢,我们快快来学习一下吧!折半查找算法
二分法查找算法又叫折半查找。其思想是将已排好序的数列依次存入数组,设查找数值为X,用指针bot指向数列最左端位置(最小值),指针top指向数列最右端位置(最大值),取bot和top的中间值mid指向数列中间,如图所示:
1(bot) 2 3 4 5 6……….. 50(mid) ………75……. 100(top)
当top>bot时,比较查找X与a[mid],有3种可能:
(1)若X = a[mid],则表示找到,退出比较查找
(2)若X < a[mid],则选择前半段继续比较查找,bot不变,top变成mid-1
(3)若X > a[mid],则选择后半段继续比较查找,bot变成mid+1,top不变
结束过程有两种:一种是找到了X = a[mid];另一种是没找到,即top < bot
折半查找算法实现如下:
1、使用递归算法:
#include "iostream"
#include "stdio.h"
#include "stdlib.h"
#define Max 10001
using namespace std;
int key;
int a1[5]={1,2,3,4,5};
int s1(int bot,int top){
int mid;
if(top>=bot){
mid=(top+bot)/2;//取中间值
if(key==a1[mid]){
cout<<mid<<endl;
return 0;
}else if(key<a1[mid]){//如果x小于中间值,则取前半段
s1(bot,mid-1);
}else{
s1(mid+1,top);//如果x大于中间值,则取后半段
}
}else{
printf("-1\n");
return 0;
}
}
int main(){ cin>>key; s1(1,5); return 0;}
2、使用非递归算法
#include <iostream>#include <cstdlib>#define MAXN 10001using namespace std;int key2,top,bot,mid;int a2[5] = {1,2,3,4,5}; void s2(){ top = 5; bot = 1; while(bot <= top){ mid = (bot + top)/2; if(key2 == a2[mid]){//如果正好找到 cout<<mid<<endl; exit(0); }else if(key2 < a2[mid]){//选择左半段 top = mid-1; }else{ bot = mid + 1; //选择右半段 } } cout<<-1<<endl;}
标签: #二分查找折半算法 #折半查找递归算法伪代码 #折半查找算法代码数据结构 #折半查找的递归算法的时间性能 #折半查找法算法分析