Java二分查找实现,欢迎大家提出交流意见.

/**
*名称:BinarySearch
*功能:实现了折半查找(二分查找)的递归和非递归算法.
*说明:
*     1、要求所查找的数组已有序,并且其中元素已实现Comparable<T>接口,如Integer、String等.
*    2、非递归查找使用search();,递归查找使用searchRecursively();
*
*本程序仅供编程学习参考
*
*@author:   Winty
*@date:     2008-8-11
*@email:    [email]wintys@gmail.com[/email]
*/

class BinarySearch<T extends Comparable<T>> {
    private T[]  data;//要排序的数据

public BinarySearch(T[] data){
        this.data = data;
    }

public int search(T key){
        int low;
        int high;
        int mid;

if(data == null)
            return -1;

low = 0;
        high = data.length - 1;

while(low <= high){
            mid = (low + high) / 2;
            System.out.println("mid " + mid + " mid value:" + data[mid]);///
            
            if(key.compareTo(data[mid]) < 0){
                high = mid - 1;
            }else if(key.compareTo(data[mid]) > 0){
                low = mid + 1;
            }else if(key.compareTo(data[mid]) == 0){
                return mid;
            }
        }

return -1;
    }

private int doSearchRecursively(int low , int high , T key){
        int mid;
        int result;

if(low <= high){
            mid = (low + high) / 2;
            result = key.compareTo(data[mid]);
            System.out.println("mid " + mid + " mid value:" + data[mid]);///
            
            if(result < 0){
                return doSearchRecursively(low , mid - 1 , key);
            }else if(result > 0){
                return doSearchRecursively(mid + 1 , high , key);
            }else if(result == 0){
                return mid;
            }
        }
        
        return -1;
    }

public int searchRecursively(T key){
        if(data ==null)return -1;

return doSearchRecursively(0 , data.length - 1 , key);
    }

public static void main(String[] args){
        Integer[] data = {1 ,4 ,5 ,8 ,15 ,33 ,48 ,77 ,96};
        BinarySearch<Integer> binSearch = new BinarySearch<Integer>(data);
        //System.out.println("Key index:" + binSearch.search(33) );

System.out.println("Key index:" + binSearch.searchRecursively(3) );

//String [] dataStr = {"A" ,"C" ,"F" ,"J" ,"L" ,"N" ,"T"};
        //BinarySearch<String> binSearch = new BinarySearch<String>(dataStr);
        //System.out.println("Key index:" + binSearch.search("A") );
    }
}

转载于:https://blog.51cto.com/wintys/94051

Java实现折半查找(二分查找)的递归和非递归算法相关推荐

  1. 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)

    目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...

  2. C语言之折半查找(二分查找)

    一.什么是折半查找? 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中 ...

  3. 容易忽视但是功能灰常强大的Java API(五. 二分查找)

    五. 二分查找 二分查找是一个高效的查找算法,在java的集合对象中也提供了二分查找的算法,如下面的java api接口: java.util.Arrays.binarySearch(java.lan ...

  4. Python查找-二分查找

    Python查找-二分查找 二分查找 折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务. 它的基本思想是,将n个元素分成个数大致相 ...

  5. 【Golang第6章:排序和查找】golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例

    介绍 这个是在B站上看边看视频边做的笔记,这一章是GO语言的排序和查找 有golang怎么排序,golang的顺序查找和二分查找,go语言中顺序查找二分查找介绍和案例,具体请看[文章目录] 配套视频自 ...

  6. 全排列之递归与非递归算法实现总结

    全排列之递归与非递归算法实现总结 递归实现 常见的是基于交换的,原理:从而可以推断,设一组数p = {r1, r2, r3, ... ,rn}, 全排列为perm(p),pn = p - {rn}. ...

  7. 数据结构二叉树中序遍历递归和非递归算法

    2022.11.19 二叉树中序遍历递归和非递归算法 任务描述 相关知识 编程要求 测试说明 C/C++代码 任务描述 本关任务:给定一棵二叉树,使用递归和非递归的方法实现二叉树的中序遍历结果. 相关 ...

  8. Java数据结构与算法——线性查找 二分查找 插值查找

    1.线性查找 有一个数列: {1,8, 10, 89, 1000, 1234} ,判断数列中是否包含此名称[顺序查找] 要求: 如果找到了,就提示找到,并给出下标值. package com.szh. ...

  9. C语言——十四种内部排序算法【直接插入排序-冒泡排序-选择排序-插入排序-希尔排序-归并排序-快速排序-堆排序-折半插入排序-二分查找-路插入排序-表插入排序-简单选择排序-直接选择排序-树形选择】

    目录: 一:插入排序 A:直接插入排序 1.定义: 2.算法演示 实例1: 3.基本思想 4.排序流程图 实例1: B:希尔排序 1.定义: 2.算法演示 实例2: C:其他插入排序 a:折半插入排序 ...

最新文章

  1. 嵌入式系统自动使能alias
  2. (第一篇)FFilmation Glossary 术语
  3. pve安装黑群晖直通硬盘_基于ProXmoX VE的虚拟化黑群晖6.2安装,硬盘直通
  4. Android 第五课 常用控件的使用方法(TextView、Button、EditView、 ImageView、 ProgressBar、 ProgressDialog等)
  5. android设置控件形状,Android控件自定义形状
  6. 谈论源码_当我们谈论开放音乐时,我们指的是什么?
  7. java 倒计时门栓,同步器
  8. ionic2+angular2中踩的那些坑
  9. c语言小树苗健康指数,一颗特别的小树苗.doc
  10. oppo r11s鸿蒙固件,OPPO R11s官方固件rom刷机包_OPPO R11s系统升级更新包下载
  11. Everything必知必会搜索教程
  12. 微信自动回复机器人含源码和安装包
  13. 目标检测基础:好文推荐
  14. Python实现随机漫步
  15. 国际象棋绘制java_java使用swing绘制国际象棋棋盘
  16. Java如何将URL读取的内容存入本地文件中
  17. GEANT4 中的NIST MATERIAL 材料名录
  18. 华为云教程(弹性云服务器ECS)
  19. Js实现中文排序,并根据拼音首字母分组
  20. 业务系统如何集成工作流系统?_K2 BPM集成能力讲解

热门文章

  1. Linux 系统的启动顺序
  2. EBS FORM开发问题总结
  3. GetModuleHandle(NULL)获取当前DLL模块基址?
  4. Jsp-Servlet 概要总结[转]
  5. ASP.NET 使用 X509Certificate2 系统找不到指定的文件
  6. 25款操作系统全面接触 [2]
  7. vue3.x通过ref属性获取元素
  8. Angular Forms - 自定义 ngModel 绑定值的方式
  9. springboot之session、cookie
  10. Vim使用技巧:撤销与恢复撤销