顺序查找与折半查找(Java)

简介: 从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直值第一个记录,其关键字和给定值比较都不想等,则表明表中没有所查记录,查找失败。

一、顺序查找


顺序查找:



从表中最后一个记录开始,逐个进行记录的关键字和给定值的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查记录;反之,若直值第一个记录,其关键字和给定值比较都不想等,则表明表中没有所查记录,查找失败。


代码实现:


#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
#define EQ(a, b) ((a)==(b))
int sequential(int array[], ElemType key, int n)
{
  int index;
  for(index = 0; index < n; index++){
  if(EQ(array[index],key))  
    return index + 1;
  } 
  return -1;
}
int main(void)
{
  ElemType array[] = {1, 4, 5, 2, 7, 8, 3};
  int length = sizeof(array);
  printf("the index you search is %d.\n", sequential(array, 5, length));
  return 0;
}


备注:查找速度慢,平均查找长度为 (n + 1) / 2,时间复杂度为 O(n) 。


二、二分查找(折半查找)


折半查找:


 首先需要要查找的序列是有序的(下面的讨论基于递增有序)。


假设Array[start , ... , end]为当前的查找区间,首先确定该区间的中间位置,即mid = (start + end) / 2;


然后将待查找的k值与Array[mid]做比较,此时有三种情况:


第一,若k = Array[mid]。则查找成功,返回mid即为查找到的位置;

第二,若k > Array[mid]。则说明k值在Array序列的右半边,此时的查找序列将变为Array[mid+1, ... , end];

第三,若k < Array[mid]。则说明k值在Array序列的左半边,此时的查找序列将变为Array[start, ... , mid-1]。

不断地递归进行下去,直到区间的长度小于1时查找结束。


代码实现:


public class BinaryFind {
  public BinaryFind() {
  // TODO Auto-generated constructor stub
  }
  public int binary_find_1(int array[],int start,int end,int k){    //折半查找的递归实现
  int find_index = -1;    //初始查找位置为-1,即代表查找失败
  if (start <= end) {    //如果区间长度大于等于1
    int mid_index = (start + end)/2;    //首先确定区间的中间位置
    if (array[mid_index] == k) {    //将要查找的k值与区间中间位置值进行比较
    return mid_index;    //k值与区间中间位置值相等,返回中间位置下标,查找成功
    }else if(k > array[mid_index]){    //k值比中间位置值大,在右半边继续递归查找
    return binary_find_1(array,mid_index+1,end,k);
    }else {    //k值比中间位置值小,在左半边继续递归查找
    return binary_find_1(array,start,mid_index-1,k);
    }
  }
  return find_index;
  }
  public int binary_find_2(int array[],int start,int end,int k){    //折半查找的循环实现
  int find_index = -1;
  while (start <= end) {
    int mid_index = (start + end)/2;
    if (array[mid_index] == k) {
    return mid_index;
    }else if(k > array[mid_index]){
    start = mid_index + 1;
    }else {
    end = mid_index - 1;
    }
  }
  return find_index;
  }
  public static void main(String[] args) {
  int[] array = {1,2,3,4,5,6,7,8,9,10};
  BinaryFind binaryFind = new BinaryFind();
  System.out.println(""+binaryFind.binary_find_2(array,0,9,5));
  }
}

备注:对于有n个记录的查找便进行折半查找的时间复杂度为O(logn)。


相关文章
|
9月前
|
Java C语言
用Java(C语言也可以看)实现冒泡排序和折半查找(详细过程图)+逆序数组
用Java(C语言也可以看)实现冒泡排序和折半查找(详细过程图)+逆序数组
88 0
|
Java
【数据结构】【折半查找法】【二分查找法】Java代码
【数据结构】【折半查找法】【二分查找法】Java代码
108 0
【数据结构】【折半查找法】【二分查找法】Java代码
|
存储 算法 Java
Java实现二分查找(折半查找)的算法
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。
215 0
|
搜索推荐 Java
数据结构 | 排序算法总结——(二)折半插入排序(附Java实现代码)
数据结构 | 排序算法总结——(二)折半插入排序(附Java实现代码)
数据结构 | 排序算法总结——(二)折半插入排序(附Java实现代码)
|
Java
折半查找(java)(边学习边更新)
---恢复内容开始--- 1 class ArrayTest3 2 { 3 public static void main(String[] args) 4 { 5 //int [] arr=new int[]{54,45,6,5,34,6...
882 0
|
算法 Java 索引
【算法数据结构Java实现】折半查找
1.背景        以一个题目为例,一个整数x是一组按大小顺序排列好的数列中的一个数,我们要找到x在数列中的索引位置。 比如按从小到大排列的数列: -3,-2,0,4,5,7,12,64 我们要找到数字7的位置,如果是线性查找,时间复杂度是O(n),如果用折半查找的话,时间复杂度是O(log(n)),因为每次折半,计算量少一半,所以取对数。 2.代码 package Algorith
980 0
|
3天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
36 14
|
6天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
34 13