查找简单理解即为在集合中查询获取需要的元素,不同的查询条件以及集合中数据的存储方式决定了使用不同的查找方法。
查找的分类
静态查找:只查找,不改变集合内的数据元素,例如:顺序查找,二分查找,分块查找
动态查找:既查找,又改变集合(增删)内的数据元素,例如:二叉树查找
1、顺序查找
又称线性查找,是从数组的第一个元素开始查找,直到找到待查找元素的位置,直到查找到结果。 最佳的状况时间是1 ,就是第一个就是待查找的远射,最差的查找状况是O(n),就是最后一个是待查找的元素。
算法思路:给定一个key值,在数组中顺序对比,若存在k = key,则查找成功,返回数组中该元素下标,失败返回-1;
int order(int[] array, int tar) {
for (int i = 0; i < array.length; i++) {
if (tar == array[i])
return i + 1;
}
return -1;
}
2、二分查找
又称折半查找,是将待查找的数组元素不断的分为两部分,每次淘汰二分之一,但是有个大前提是,元素必须是有序的,如果是无序的则要先进行排序操作,这种查找的方法,类似于找英文字典的Java,我们可以一下子找到字母J开头的,再仔细找。 最佳的状况时间是1,就是第一次分开就查找到了,最差的查找状态是O(n),便是待查找的数据出现在最后一次。
前提:元素必须是有序的,如果是无序的则要先进行排序操作
二分法查找递归实现
public class testBinaryOne {
public static Integer testBinarySearch(int[] a,int key,int low,int high){
if(low > high){
return -1;
}
while(low <= high){
int mid = (low + high)/2;
if(key == a[mid]){
return mid;
}else if(key < a[mid]){
return testBinarySearch(a,key,low,mid-1);
}else{
return testBinarySearch(a,key,mid+1,high);
}
}
return -1;
}
public static void main(String[] args){
int[] a = {1,3,5,7,9,11,13,16,22,55};
Integer mm = testBinarySearch(a, 16,0,a.length);
System.out.println("16的位置在:"+ mm +"位");
}
}
二分法查找非递归实现
public class TestSearch {
public static Integer testBinarySearch(int[] a,int key){
int low = 0;
int high = a.length;
if(low > high){
return -1;
}
while(low <= high){
int mid = (low + high)/2;
if(key == a[mid]){
return mid;
}else if(key < a[mid]){
high = mid - 1;
}else{
low = mid + 1;
}
}
return -1;
}
public static void main(String[] args){
int[] a = {1,3,5,7,9,11,13,16,22,55};
Integer mm = testBinarySearch(a, 16);
System.out.println("16的位置在:"+ mm +"位");
}
}
3、分块查找
分块查找又称索引顺序查找,它是顺序查找的一种改进方法。
一、先选取各块中的最大关键字构成一个索引表;
二、查找分两个部分:先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中;
然后,在已确定的块中用顺序法进行查找。
typedef int keytype;
typedef struct {
keytype Key;
}elemtype;
typedef struct{
keytype Key;
int Link;
}indextype;
/**
* 分块查找关键字为Key的记录。索引表为ls[0]-ls[m-1],顺序表为s,块长为l
*/
int IndexSequelSearch(indextype ls[],elemtypes[],int m,int l,keytype Key){
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;
}
}
4、二叉树查找
二叉查找树是先对待查找的数据进行生成树,确保树的左分支的值小于右分支的值,然后在就行和每个节点的父节点比较大小,查找最适合的范围。
这个算法的查找效率很高,但是如果使用这种查找方法要首先创建树。
// 二叉树递归查找算法
BinaryTreeNode binaryTreeRecusion(BinaryTreeNode bt, Object tar) {
if (bt == null)
return new BinaryTreeNode("null");
switch (strategy.compare(tar, bt.getData())) {
case -1:// tar比data小就查找左子树
return binaryTreeRecusion(bt.getLeftChild(), tar);
case 1:// tar比data大就查找右子树
return binaryTreeRecusion(bt.getRightChild(), tar);
default:// 比较结果是0,tar和data相等就返回
return bt;
}
}
// 二叉树非递归查找算法
BinaryTreeNode binaryTree(BinaryTreeNode bt, Object tar) {
while (bt != null) {
switch (strategy.compare(tar, bt.getData())) {
case -1:// tar比data小就查找左子树
return bt = bt.getLeftChild();
case 1:// tar比data大就查找右子树
return bt = bt.getRightChild();
default:// 比较结果是0,tar和data相等就返回
return bt;
}
}
return new BinaryTreeNode("null");
}
分享到:
相关推荐
在计算机科学中,查找算法是一种基本且常用的算法,它们的应用非常广泛。本文将对几种常用的查找算法进行比较,包括顺序查找、二分查找、二叉树查找和哈希表查找。 顺序查找是一个最简单的查找算法,它的时间复杂度...
本实验主要探讨了三种基本的查找算法:顺序查找、折半查找(二分查找)和索引查找,这些算法都是在数组或集合中寻找特定元素的重要方法。下面将详细解释这三种查找算法,并结合C语言编程环境进行深入分析。 1. **...
在这个名为"aaa.rar_常用查找算法_查找和排序"的压缩包中,包含了几个经典算法的源代码实现,主要涉及冒泡排序、选择排序、插入排序以及折半查找。下面将详细介绍这些算法及其工作原理。 1. **冒泡排序**: 冒泡...
本资料包详细介绍了几种常见的查找算法,包括顺序查找、二分查找、分块查找、二叉排序树查找以及哈希查找。 **顺序查找**是最基础的查找方法,适用于任何无序或有序的数据序列。它按照元素的顺序逐个比较,直到找到...
### 查找算法概述 查找算法是计算机科学中最基础也是最重要的算法之一,主要目的是在大量数据中高效地定位特定的信息元素。查找算法的选择取决于数据的组织形式、数据量大小以及查找性能的要求。 ### 1. 顺序查找...
C++常用查找算法学习笔记 本篇学习笔记主要介绍了C++中常用的查找算法,包括find_if、adjacent_find和binary_search等。 find_if算法 find_if算法是C++ STL中的一种查找算法,用于查找容器中的元素是否满足某个...
本文将详细介绍四种常用查找算法:顺序查找、二分查找、分块查找与哈希表查找。通过理解这些算法的定义、原理和适用场景,开发者们可以更加有效地选择和实现适合特定需求的查找策略。 顺序查找是最基本也是最简单的...
在本实验中,我们主要关注的是“数据结构课程9”的实验部分,重点是研究和实现“常用查找算法”。这些算法是计算机科学中的基础且至关重要的组成部分,尤其在处理大规模数据时,高效的查找策略能显著提升程序性能。...
以下是四种常见的查找算法:顺序查找、二分查找、插值查找和动态查找。 顺序查找 顺序查找是一种最简单的查找算法,它的实现方式是从数组或链表的第一个元素开始,逐个比较元素直到找到目标元素或达到数组或链表的...
本文将深入探讨C语言中几种常见的查找算法,帮助理解它们的原理、特点及应用场景。 一、静态查找 在数据结构中,静态查找主要是针对已经排序的数据集合进行元素检索的过程。常见的静态查找算法包括顺序查找、索引...
- 虽然文档中没有具体讨论查找算法,但在Java中,常见查找算法包括线性查找、二分查找、哈希查找等。线性查找适用于未排序或部分排序的数据,而二分查找适用于有序数组,哈希查找则通过哈希表提供快速的查找能力。 ...
折半查找算法是一种常用的查找算法,它可以在已经排好序的顺序表中快速地找到某个元素。下面我们来详细讲解折半查找算法在顺序表中插入一个元素的过程。 折半查找算法的基本思想是将整个查找区间分为两半,然后通过...
查找算法通常根据数据的存储方式和查找方法进行分类,常见的查找算法包括线性查找、二分查找、分块查找、基于树的查找(例如二叉查找树BST、平衡树AVL树、B树和B+树)以及散列技术等。 查找算法的学习目标包括理解...
本文总结了常见的查找算法和排序算法,包括顺序查找、二分查找、选择排序、冒泡排序、二分排序、插入排序、希尔排序、堆排序、归并排序等。 一、查找算法 1. 顺序查找(Sequential Search) 顺序查找是一种简单...
常见查找算法包括: 1. **线性查找**:从头到尾遍历序列,直到找到目标元素或搜索完整个序列。时间复杂度为O(n)。 2. **二分查找**:适用于有序数组,通过不断取中间元素与目标比较来缩小搜索范围。时间复杂度为O...
下面我们将深入探讨这些常用排序查找算法。 首先,我们来看看排序算法。排序是一系列将一组数据按照特定顺序排列的过程。这里提及的"【排序结构1】插入排序"是一种简单直观的算法,它通过构建有序序列,对于未排序...
首先,我们来看查找算法。查找算法的目标是在数据集合中寻找特定元素。以下是几种常见的查找方法: 1. **顺序查找**:是最基本的查找方法,从数据集的第一个元素开始逐个比较,直到找到目标元素或遍历完所有元素。...
数据结构中的查找算法是计算机科学中的重要组成部分,它涉及到如何高效地在大量数据中寻找特定信息。查找操作,也就是检索,通常在数据元素的集合,即查找表中进行。查找的效率与查找对象的组织方式和所采用的查找...
这里我们将深入探讨两种常见的查找算法:二分查找和顺序查找。 **一、顺序查找** 顺序查找是最基础的查找算法之一。它的工作原理是从数据集(如数组或列表)的第一个元素开始,逐个比较目标值与当前元素,直到找到...
常见的查找算法有线性查找、二分查找、二叉搜索树查找等。然而,这些算法在大数据量的情况下,效率可能较低,尤其是在无序数据中进行线性查找时。 哈希表的引入解决了这个问题。它使用哈希函数将键(key)转化为数...