二分查找(可重复数据)-Java

【说明】:重点在于找到中间的那个值后,如果有重复的元素,需要以这个元素的位置分别向左边和右边遍历。将所有的值存在一个List集合中,然后返回,输出即可。没有找到就是-1.

package com.yang.search;

import java.util.ArrayList;
import java.util.List;

/**
 * 二分查找:需要注意的是二分查找的前提是,有序的数组。
 */
public class BinarySearch {


    public static void main(String[] args) {
        //初始化数组
        int[] arr={1,45,2,12,31,45,66,78,90,45};
        List<Integer> index=binarySearch(arr,0,arr.length-1,45);
        for (int i:index){
            System.out.print(i+" ");
        }
    }

    /**
     * 查找的具体实现
     * @param a:查找的数组
     * @param left:查找的左边界
     * @param right:查找的右边界
     * @param value:查找的值
     * @return 如果找到就返回元素的下表,否则返回-1
     */
    public static List<Integer> binarySearch(int[] a,int left,int right,int value){

        List<Integer> lists= new ArrayList<Integer>();

        //没有找到时的条件
        if(left>right){
            System.out.print("没有找到:");
            lists.add(-1);
            return lists;
        }
        //找到数组的中间的一个值
        int mid=(left+right)/2;
        //比较a[mid]与value的大小
        if(value>a[mid]) return binarySearch(a,mid+1,right,value);              //向右递归
        else if(value<a[mid]) return binarySearch(a,left,mid-1,value);          //向左递归
        else {

            //遍历找到后的那个元素的左边是否有重复的元素
            for(int i=0;i<mid-1;i++){
                if(a[i]==a[mid])
                    lists.add(i);
            }
            lists.add(mid);
            //遍历找到后的那个元素的右边是否有重复的那个元素
            for(int j=mid+1;j<a.length;j++){
                if(a[j]==a[mid])
                    lists.add(j);
            }
            return lists;
        }
    }
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
简介 第1章 综述 数据结构和算法能起到什么作用? 数据结构的概述 算法的概述 一些定义 面向对象编程 软件工程 对于C++程序员的Java Java数据结构的类库 小结 问题 第2章 数组 Array专题Applet Java中数组的基础知识 将程序划分成类 类接口 Ordered专题applet 有序数组的Java代码 对数 存储对象 大O表示法 为什么不用数组表示一切? 小结 问题 实验 编程作业 第3章 简单排序 如何排序? 冒泡排序 选择排序 插入排序 对象排序 几种简单排序之间的比较 小结 问题 实验 编程作业 第4章 栈和队列 不同的结构类型 栈 队列 优先级队列 解析算术表达式 小结 问题 实验 编程作业 第5章 链表 链结点(Link) LinkList专题Applet 单链表 查找和删除指定链结点 双端链表 链表的效率 抽象数据类型 有序链表 双向链表 迭代器 小结 问题 实验 编程作业 第6章 递归 三角数字 阶乘 变位字 递归的二分查找 汉诺(Hanoi)塔问题 归并排序 消除递归 一些有趣的递归应用 小结 问题 实验 编程作业 第7章 高级排序 希尔排序 划分 快速排序 基数排序 小结 问题 实验 编程作业 第8章 二叉树 为什么使用二叉树? 树的术语 一个类比 二叉搜索树如何工作 查找节点 插入一个节点 遍历树 查找最大和最小 删除节点 二叉树的效率 用数组表示树 重复关键字 完整的tree.java程序 哈夫曼(Huffman)编码 小结 问题 实验 编程作业 第9章 红-黑树 第10章 2-3-4树和外部存储 第11章 哈希表 第12章 堆 第13章 图 第14章 带权图 第15章 应用场合 附录A 运行专题applet和示例程序 附录B 进一步学习 附录C 问题答案

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值