`

Java 中几种查找算法

    博客分类:
  • java
 
阅读更多

说明:顺序查找适合于存储结构为顺序存储或链接存储的线性表。 
int SequelSearch(elemtype s[],keytype Key,int n)
/*在s[0]-s[n-1]中顺序查找关键字为Key的记录*/
/*查找成功时返回该记录的下标序号;失败时返回-1*/
{
int i;
i=0;
while(i<n&&s[i].Key!=Key)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<a[mid]) return(BSearch(a,x,low,mid-1));
else return(BSearch(a,x,mid+1,high));
}

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<key) low=mid+1;
      else high=mid-1;
   }
return -1;
}

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

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(i<m&&Key>ls[i].Key)i++;

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

    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(x<b->data) 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(Key<p->Key) 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->data<b->data)
       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->Key<Key&&bt->Rchild!=NULL)
   bt->Rchild=Delete(bt->Rchild,Key);

return(bt);
}

分享到:
评论

相关推荐

    java 几种查找算法

    java 几种查找算法

    Java几种常见的排序算法

    Java几种常见的排序算法

    Java常用算法手册源代码

    2.1.5 数据结构的几种存储方式 2.1.6 数据类型 2.1.7 常用的数据结构 2.1.8 选择合适的数据结构解决实际问题 2.2 线性表 2.2.1 什么是线性表 2.2.2 线性表的基本运算 2.3 顺序表结构 2.3.1 准备数据 2.3.2 初始化...

    Java数据结构和算法中文第二版

    几种简单排序之间的比较 小结 问题 实验 编程作业 第4章 栈和队列 不同的结构类型 栈 队列 优先级队列 解析算术表达式 小结 问题 实验 编程作业 第5章 链表 链结点(Link) LinkList专题Applet ...

    Java数据结构和算法中文第二版(1)

    几种简单排序之间的比较 小结 问题 实验 编程作业 第4章 栈和队列 不同的结构类型 栈 队列 优先级队列 解析算术表达式 小结 问题 实验 编程作业 第5章 链表 链结点(Link) LinkList专题Applet...

    java数据结构与算法第二版

    几种简单排序之间的比较 小结 问题 实验 编程作业 第4章 栈和队列 不同的结构类型 栈 队列 优先级队列 解析算术表达式 小结 问题 实验 编程作业 第5章 链表 链结点(Link) LinkList专题Applet ...

    Java数据结构和算法(第二版)

    几种简单排序之间的比较 小结 问题 实验 编程作业 第4章 栈和队列 不同的结构类型 栈 队列 优先级队列 解析算术表达式 小结 问题 实验 编程作业 第5章 链表 链结点(Link) LinkList专题Applet 单链表 查找和删除...

    Java数据结构和算法中文第二版(2)

    几种简单排序之间的比较 小结 问题 实验 编程作业 第4章 栈和队列 不同的结构类型 栈 队列 优先级队列 解析算术表达式 小结 问题 实验 编程作业 第5章 链表 链结点(Link) LinkList专题Applet...

    《算法》中文版,Robert Sedgewick,塞奇威克

    5.3.3 Knuth-Morris-Pratt子字符串查找算法 5.3.4 Boyer-Moore字符串查找算法 5.3.5 Rabin-Karp指纹字符串查找算法 5.3.6 总结 5.4 正则表达式 5.4.1 使用正则表达式描述模式 5.4.2 缩略写法 5.4.3 正则...

    韩顺平java源码-DataStructJava:韩顺平JAVA数据结构与算法,重点是算法!

    sort里面是几种排序方法:冒泡排序、插入排序、选择排序、希尔排序 recursion recursion里面是递归的案例,迷宫回溯、一些递归测试、八皇后问题 dac 分治算法里面是汉诺塔问题 dynamic dynamic背包问题 search ...

    算法实践(JavaScript &amp; Java),排序,查找、树、两指针、动态规划等.zip

    Java的主要特点和优势包括以下几个方面: 跨平台性(Write Once, Run Anywhere): Java的代码可以在不同的平台上运行,只需编写一次代码,就可以在任何支持Java的设备上执行。这得益于Java虚拟机(JVM),它充当了...

    C/C++常用算法手册.秦姣华(有详细书签).rar

    2.1.5 数据结构的几种存储方式 18 2.1.6 数据类型 19 2.1.7 常用的数据结构 20 2.1.8 选择合适的数据结构解决实际问题 21 2.2 线性表 21 2.2.1 什么是线性表 21 2.2.2 线性表的基本运算 22 2.3 顺序表结构 ...

    JAVA上百实例源码以及开源项目

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    JAVA上百实例源码以及开源项目源代码

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    java数据结构测试题及答案解析.doc

    Java数据结构试题及解析 1 下列数据结构中,能用二分法进行查找的是__A____。 A、顺序存储的有序线性表 B、线性链表 C、二叉链表 D、有序线性链表 解析:二分法查找只适用于顺序存储的有序表。在此所说的有序表是指...

    JAVA冒泡排序及其优化

    用java 编写的冒泡排序算法,并涵盖了冒泡排序算法的几种优化方式,以及在冒泡排序上的二分查找法。

    算法导论(part1)

    如果希望实现这些算法中的任何一个,就会发现,将书中的伪代码翻译成读者熟悉的某种程序设计语言,是一件相当直接的事。伪代码被设计成能够清晰简明地描述每一个算法。因此,我们不考虑出错处理和其他需要对读者所用...

    Algorithmically:用几种不同的语言编写的几种算法,图形化和描述性

    用几种不同语言编写的几种算法,使用 unix time() 和 D3 JS poop 进行图形化和描述 ###灵感 取自和一个关于算法和 BigO 符号的失败采访 ###算法检查 ####搜索 深度优先搜索 (DFS) 广度优先搜索 (BFS) 二分查找 ...

    算法导论(part2)

    如果希望实现这些算法中的任何一个,就会发现,将书中的伪代码翻译成读者熟悉的某种程序设计语言,是一件相当直接的事。伪代码被设计成能够清晰简明地描述每一个算法。因此,我们不考虑出错处理和其他需要对读者所用...

Global site tag (gtag.js) - Google Analytics