java 查找算法_Java 中几种查找算法

顺序查找说明:顺序查找适合于存储结构为顺序存储或链接存储的线性表。

int SequelSearch(elemtype s[],keytype Key,int n)/*在s[0]-s[n-1]中顺序查找关键字为Key的记录*//*查找成功时返回该记录的下标序号;失败时返回-1*/{int i;i=0;while(i

if(s[i].Key==Key)return i;else return -1; }

----------------------------二分查找

1、递归方法实现:int BSearch(elemtype a[],elemtype x,int low,int high)/*在下届为low,上界为high的数组a中折半查找数据元素x*/{int mid;if(low>high) return -1;mid=(low+high)/2;if(x==a[mid]) return mid;if(x

2、非递归方法实现:int BSearch(elemtype a[],keytype key,int n){int low,high,mid;low=0;high=n-1;while(low<=high)    {      mid=(low+high)/2;      if(a[mid].key==key) return mid;      else if(a[mid].key

--------------------------分块查找

typedef int keytype;

typedef struct{keytype Key;}elemtype;

typedef struct{keytype Key;int Link;}indextype;

int IndexSequelSearch(indextype ls[],elemtypes[],int m,int l,keytype Key)/*分块查找关键字为Key的记录。索引表为ls[0]-ls[m-1]*//*顺序表为s,块长为l*/{int i,j;/*在索引表中顺序查找*/i=0;while(ils[i].Key)i++;

if(i>=m)return -1;else{    /*在顺序表中顺序查找*/    j=ls[i].Links;    while(Key!=s[j].Key&&j-ls[i].Link

if(Key==s[j].Key)return j;    else return -1; }}

----------------------------二叉排序树查找

1、二叉排序树查找算法:a、非递归算法:btree *search(btree *b,int x)/*在二叉树b中查找x的过程*/{if(b=NULL) return(NULL);else   {     if(b->data==x) return(b);     if(xdata) return(search(b->left));     else return(search(b->right));   } }

b、递归算法:bsnodetype *Search(bsnodetype *bt,keytype Key)/*在二叉树bt中查找元素为Key的元素*/{bsnodetype *p;if(bt==NULL) return(bt);

p=bt;while(p->Key!=Key){    if(KeyKey) p=p->Lchild;    else p=p->Rchild;    if(p==NULL)break;}return(p);}

2、二叉树的生成a、向一个二叉树b中插入一个结点s的函数如下:void insert(b,s)btree *b,*s;{if(b==NULL) b=s;else if(s->data==b->data)        return();else if(s->datadata)       insert(b->left,s);else if(s->data>b->data)       insert(b->right,s);}

b、生成二叉树void create(btree *b){int x;btree 8s;b==NULL;

do{   scanf("%d",&x);   s=(bnode *)malloc(sizeof(bnode));   s->data=x;   s->left=NULL;   s->right=NULL;   insert(b,s); }while(x!=-1);}

c、从二叉树中删除一个结点

bsnodetype *Delete(bsnodetype *bt,keytype Key)/*在bt为根结点的二叉树中删除值为Key的结点*/{bsnodetype *p,*q;if(bt->Key==Key) {    /*bt的左右子树均为空*/    if(bt->Lchild==NULL&&bt->Rchild==NULL)     {       free(bt); /*删除叶结点*/       return(NULL);     }    else if(bt->Lchild==NULL)/*bt的左子树为空*/     {       p=bt->Rchild;       free(bt);       return(p);     }        else if(bt->Rchild==NULL)/*bt的右子树为空*/     {       p=bt->Lchild;       free(bt);       return(p);      }   else    {       p=q=bt->Rchild;       while(p->Lchild!=NULL)p=p->Lchild;       p->Lchild=bt->Lchild;       free(bt);       return(q);    }}

/*在bt->Lchild为根结点的二叉树中删除值为Key的结点*/if(bt->Key>Key&&bt->Lchild!=NULL)   bt->Lchild=Delete(bt->Lchild,Key);

/*在bt->Rchild为根结点的二叉树中删除值为Key的结点*/if(bt->KeyRchild!=NULL)   bt->Rchild=Delete(bt->Rchild,Key);

return(bt);}

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2011-05-12 10:31

浏览 1094

评论

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值