折半查找

Posted djcf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了折半查找相关的知识,希望对你有一定的参考价值。

#include <iostream>

using namespace std;

#define MAXSIZE 50

typedef int KeyType;

typedef struct KeyType key; ElemType;

typedef struct ElemType *R; int length; SSTable;

void Create(SSTable &T) int i; T.R=new ElemType[MAXSIZE+1]; cin>>T.length; for(i=1;i<=T.length;i++) cin>>T.R[i].key;

int Search_Bin(SSTable T, KeyType k);

int main ()

SSTable T;

KeyType k;

Create(T);

cin>>k;

int pos=Search_Bin(T,k);

if(pos==0) cout<<"NOT FOUND"<<endl;

else cout<<pos<<endl;

return 0;

int Search_Bin(SSTable T, KeyType k)

int min=1,max=T.length;
int mid=(min+max)/2;
while(max>=min)//折半查找循环,左右边界作为循环条件比(1)循环运行效率高;

if(k==T.R[mid].key)
break;
else
if(k>T.R[mid].key)
min=mid+1;
mid=(min+max)/2;

else

max=mid-1;
mid=(min+max)/2;



if(min<=max)
return mid;
else
return 0;

 

查找算法之折半查找+分块查找

折半查找+分块查找

基本概念

  1. 查找表:由同一种类型的数据元素(记录)组成
  2. 静态查找表:只需要查找算法
  3. 动态查找表:除了查找,还需要增删改查数据元素
  4. 关键字:唯一标识数据元素的数据项

常见的查找算法

折半查找

概念

折半查找又称二分查找,仅适用于有序的顺序表,不能用链表。

算法

//查找算法
int binary_search(seqlist L,Elemtype key)

int low,high=L.TableLen-1,mid;
while(low<=high)

mid=(low<=high)/2;
if(L.elem[mid]==key)
return mid;
else if(L.elem[mid]>key)
high=mid-1;
else
low=mid-1;

return -1;

折半查找树的构造

  1. 如果当前LOW和HIGH之间有奇数个元素,则MID分割后,左右两部分元素个数相等
  2. 如果当前LOW和HIGH之间有偶数个元素,则MID分割后,左部分比右半部分少一个元素
  3. 折半查找的判定树中,若MID=(LOW=HIGH)/2向下取整,则对于任何一个节点,必有右子树结点数-左子树结点数=0或1
  4. 折半查找判定树必定是平衡二叉树
  5. 折半查找判定树中,只有最下面一层是不满的,因此元素个数为n时,树高h=log2(n+1)向下取整
  6. 失败结点:n+1(等于成功节点的空链域数量)

分块查找

分块查找,又称索引顺序查找,算法过程:

  1. 在索引表中确定待查记录所属的分块(可顺序,可折半)
  2. 在块中查找
  3. 若索引表中不包含目标关键字,则折半查找索引表最终停在LOW>HIGH,要在LOW所指分块中查找

后续

如果想了解更多物联网、智能家居项目知识,可以关注我的程序设计专栏
订阅专栏后,可以在微信公众号上私聊我,直接发给你源码。
或者关注公众号。

编写不易,感谢支持。

以上是关于折半查找的主要内容,如果未能解决你的问题,请参考以下文章

查找算法之折半查找+分块查找

C++折半查找法

C语言折半查找法详细代码(假如有10个已排好序的数)

查找有序表折半查找判定树二叉排序树3阶B-树

C语言折半查找之递归算法

折半查找的概念及实现代码