说明:顺序查找适合于存储结构为顺序存储或链接存储的线性表。
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中实现的几种常见的搜索算法,包括二分搜索和线性搜索,这些都是数据结构和算法学习的重要部分。 首先,我们来理解这两种搜索算法的基本概念: 1. **线性搜索**(Linear Search):这是最...
二分查找算法是一种在有序数组中查找特定元素的搜索算法。其工作原理是通过将目标值与数组中间元素进行比较来缩小搜索范围,进而达到快速查找的目的。由于每次比较后都能排除掉一半的元素,因此它的平均时间复杂度为...
本篇文章将详细讨论几种常见的哈希算法及其在Java中的实现。 1. **MD5(Message-Digest Algorithm 5)** MD5是一种广泛使用的哈希函数,产生128位(16字节)的哈希值,通常表示为32个十六进制数字。尽管MD5在安全...
本篇主要探讨几个在Java中常见的算法,这些算法在实际开发中有着广泛的应用。 1. **排序算法**:Java中实现排序有多种方式,如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。其中,冒泡排序和选择...
在Java中实现这一算法,我们需要以下几个步骤: 1. **创建图形对象**:使用Java的`java.awt.Graphics2D`类创建一个画布,以便在其中进行绘图和填充操作。 2. **定义种子像素**:用户可以通过鼠标点击或输入坐标来...
以下是对给定文件中提及的几个经典算法题目的深入解析,旨在帮助准备Java面试的开发者们全面掌握相关知识点。 ### 1. 打印九九乘法表 在Java中实现九九乘法表的打印,主要涉及到嵌套循环的应用。代码示例中,外层...
Java实现k近邻(kNN)算法是机器学习领域中一种基础且重要的算法,主要用于分类和回归问题。kNN算法基于实例的学习,它不预先建立任何模型,而是将新数据分类或预测为与其最近的k个训练样本中最常见的类别。在这个讨论...
本文主要探讨了几种常见的无损压缩算法,并分析了它们在Java Web程序中的应用。 一、Huffman编码(哈夫曼编码) Huffman编码是一种广泛使用的无损压缩算法,由David Huffman在1952年提出。其原理是根据字符在数据中...
以下是对Java中几种常见排序算法的详细解析: 1. 冒泡排序: 冒泡排序是一种简单直观的排序算法,通过不断交换相邻的不正确顺序元素来达到排序的目的。它的时间复杂度为O(n^2),在处理大量数据时效率较低。尽管效率...
Java算法大全源码包是一个集合了近一百种算法实现的宝贵资源,对于学习和提升Java编程技巧,尤其是算法设计与分析能力来说,是极其重要的工具。这个源码包涵盖了从基础到高级的各种算法,旨在帮助开发者深入理解算法...
在本压缩包中,你将找到以下几类经典算法的实现: 1. 排序算法:如快速排序(Quick Sort)、归并排序(Merge Sort)、堆排序(Heap Sort)和插入排序(Insertion Sort)。这些算法用于对数据进行有序排列,理解它们...
4. **根查找算法**:寻找函数的零点,如二分法、牛顿-拉弗森法等。这些方法在解决方程求解问题时非常有用,Java可以通过迭代实现。 5. **优化算法**:如梯度下降法、牛顿法、遗传算法等,用于找到函数的最小值或...
例如,快速排序和二分查找算法就采用了递归思想。 5. **回溯法**:这是一种试探性的解决问题方法,当遇到死胡同时能“回退”到上一步,尝试其他可能的分支。常用于解决组合优化问题,如八皇后问题、迷宫求解等。 6...
在实际操作中,构建树形结构的算法需要考虑以下几个关键点: 1. 节点关系的构建:需要根据数据间的层级关系,确定节点的父子关系。 2. 一次性加载数据:为了减少数据库的查询压力和提高访问速度,可以考虑将相关数据...
本主题“Java程序设计-常见算法”主要涵盖查找算法和排序算法两个大类,下面将详细阐述这两个领域的基本概念、原理以及它们在Java中的实现。 首先,我们来讨论查找算法。查找算法的目标是在数据集合中找到特定元素...
在Java中实现决策树,我们需要关注以下几个关键组件: 1. **数据表示**:数据通常以二维数组或DataFrame的形式存储,其中每一行代表一个样本,每一列代表一个特征。例如,可以创建一个`Sample`类,包含所有特征值和...
在IT领域,特别是数据分析与机器学习中,K近邻(K-Nearest Neighbors, KNN)算法是一种广泛应用且理解起来相对直观的监督学习方法。KNN算法是基于实例的学习,它通过查找训练集中与未知类标数据点最相似的K个邻居来...