java数据结构学习(一)之二分查找

  二分查找法与我们在孩童时期玩过的猜数的游戏一样,这个游戏里一个朋友会让你猜他正想的一个1至100的数,当你猜了一个数后,他会告诉你三种选择的一个:你猜的比她想的大,或小,或猜中了。为了能用最少的次数猜中,必须从50开始猜,如果她说你猜的太小,则推出那个数在51-100之间,所以下一次猜75((51+100)/2),如果她说有些大,那你就会在51-74之间才,下一次猜(51+74)/2=62。直到猜中她所给的数。

下面给出我们猜1-100的数,key为33的过程:

  

只需7次就可以猜中答案。下面我们给出二分查找的代码:

public class BinarySearch {
    private long[] a;
    private int nelems;
    public BinarySearch(int max){
        a = new long[max];
        nelems = 0;
    }
    //返回数组的长度
    public int size(){
        return nelems;
    }
    /**
     * 二分查找算法关键代码
     * @return
     */
    public int binarySearch(long searchKey){
        int low = 0;
        int high = nelems-1;
        int curIn;
        while(true){
            curIn = (low + high)/2;//划分范围的点
            if(a[curIn] == searchKey){//幸运判断,很幸运正好猜中
                return curIn; //返回要猜的数的位置
            }else if(low > high){//范围不存在
                return nelems;//没找到,返回数组的长度
            }else{
                if(searchKey > a[curIn]){
                    low = curIn + 1;
                }else{
                    high = curIn - 1;
                }
            }
        }
    } 

    /**
     *
     * 在有序数组里面插入数
     * @param args
     */
    public void insertOrderArray(long value){
        int i;
        for(i=0;i<nelems;i++){//遍历有序数组里面的元素与插入的数进行比较
            if(a[i] > value){//如果有序数组里面的某一个数比插入的数大,则结束遍历
                break;
            }
        }

        //插入的位置i,及i后面到的元素都要向右移动,腾出一个插入位置
        for(int k=nelems;k>i;k--){
            a[k] = a[k-1];//a[10]=a[9],a[9] = a[8]插入点后面的都向右移动一个位置
        }
        a[i] = value;//移动后腾出位置插入要插入的数
        nelems++;
    }
    /**
     * 删除有序数组里面的数
     */
    public boolean delete(long key){
        int i = binarySearch(key);//返回找到的数字数组下标
        if(i==nelems){
            return false;
        }else{
            int j;
            for(j=i;j<nelems;j++){
                a[j] = a[j+1];//向前移动
            }
            nelems--;//数组长度减少
            return true;

        }
    }
    /**
     * 显示数组中的数
     */
    public void display(){
        System.out.println("***************");
        for(int j=0;j<nelems;j++){
            System.out.print(a[j]+" ");
            System.out.print("");
        }
    }
    public static void main(String[] args){
        int maxSize = 100;
        BinarySearch arr = new BinarySearch(maxSize);
        arr.insertOrderArray(30);
        arr.insertOrderArray(12);
        arr.insertOrderArray(15);
        arr.insertOrderArray(10);
        arr.insertOrderArray(90);
        arr.insertOrderArray(100);
        arr.insertOrderArray(101);
        arr.insertOrderArray(80);
        System.out.println("##############");
        arr.display();
        long keySearch = 102;
        if(arr.binarySearch(keySearch) != arr.size()){//上面返回值为没找到返回nelems长度
            System.out.println("找到"+keySearch);
        }else{
            System.out.println("没有找到"+keySearch);
        }
        arr.delete(30);
        arr.delete(100);
        arr.display();
    }
}

java数据结构学习(一)之二分查找

时间: 2024-10-05 04:58:30

java数据结构学习(一)之二分查找的相关文章

Java数据结构学习—Collections类

java.util 类 Collections java.lang.Object java.util.Collections public class Collections extends Object 此类完全由在 collection 上进行操作或返回 collection 的静态方法组成.它包含在 collection 上操作的多态算法,即"包装器",包装器返回由指定 collection 支持的新 collection,以及少数其他内容. 如果为此类的方法所提供的 colle

【数据结构与算法】二分查找

基本思想 首先将给定的值K与表中中间位置元素比较,若相等,则查找成功:若不等,则所需查找的元素只能在中间数据以外的前半部分或者后半部分,缩小范围后继续进行同样的查找,如此反复,直到找到为止. 代码实现 /** * 源码名称:BinarySearch.java * 日期:2014-08-14 * 程序功能:二分查找 * 版权:[email protected] * 作者:A2BGeek */ public class BinarySearch { public static int binaryS

java数据结构学习之—Collection接口

Collection接口代表一组对象,这组对象称为它的元素,有些实现(如链表)是无序的,有些实现(集合和映射)是有序的,有些实现是允许重复的,而有些实现不允许重复,从java5开始,Collection接口和整个集合类API都使用泛型,所有容器都支持一下操作: 1.boolean isEmpty() 如果容器不包含任何元素,则返回true,否则返回false. 2.int size() 返回容器中元素的个数 3.boolean add(AnyType x) 将项X添加到容器中,如果操作成功,则返

Java数据结构学习—Iterator接口

迭代器是一个对象,它能是我们迭代集合中的所以元素 在Java集合类API中,Iterator接口很小,只包含三个方法: 1.boolean hasNext() 如果在这次迭代中还有迭代浏览的的项,则返回true. 2.AnyType next() 返回这个迭代器还未看到的对下一个对象的引用,对象变为可见,则迭代器后移. 3.void remove() 三次浏览的最后一个项,在对next的调用之前,只能用一次这种方法. 每个集合都定义了自己的Iterator接口的实现,对java.util包中的

学习快速排序和二分查找算法

1. 快速排序的思想采用的是分治算法实现,从头选择一个元素是作为"哨兵元素",然后从尾部开始寻找一个比"哨兵元素"小的元素,然后跟它交换,接着从头开始寻找比"哨兵元素"大的:元素,然后交换,直到"哨兵元素"的左边都"哨兵元素"小,右边都比"哨兵元素"大为止,这算是一次划分,快速排序是要经过的 k-1趟(假设有k个元素)划分才能排序好所有的元素. 下面根据分治实现的java代码: publ

数据结构与算法之-二分查找

概念     二分查找又称折半查找,它是一种效率较高的查找方法.它的时间复杂度为O(logn)     二分查找要求:有序的线性表 基本思想     二分查找的基本思想是划分当前查找区间,区间的范围一步一步的缩小,如果找到直接返回,反之直到区间只有一个元素时停止 实现     设R为一个值递增的有序线性表     实现步骤: 首先确定该区间的中点位置:mid=[(low+high)/2] 然后将key值与R[mid]的值比较:若相等,则直接返回当前mid,否则进行确定新的区间操作,这分为两种情况

数据结构与算法之二分查找

问题:如果有一个有100个元素的已经排好序的数组,然后给你一个数,让你判断这个数组里面是否有这个数,你该怎样去做? 最简单的方法就是从数组的第一个元素开始,逐一与所给的数比较,直到比较完所有数组的元素为止,这种查找方法叫简单查找,是一个费事的方法.但我们想,既然这100个数都已经排好序了,那么我先拿中位数与所给数比较,如果两者匹配则问题解决.如果中位数比所给数大,那么所给数可能存在与中位数左边,我们就可以拿左边那些数的中位数与所给数比较:如果中位数比所给数小,那么所给数可能存在与中位数的右边,我

数据结构和算法之——二分查找上

二分查找(Binary Search)的思想非常简单,但看似越简单的东西往往越难掌握好,想要灵活运用就更加困难. 1. 二分查找的思想? 生活中二分查找的思想无处不在.一个最常见的就是猜数游戏,我随机写一个 0 到 99 的数,然后你来猜我写的是什么.猜的过程中,我会告诉你每次是猜大了还是猜小了,直到猜中为止.假如我写的数是 23,猜数过程如下所示. 最多只需要 7 次就猜出来了,这个过程是很快的.同理,要查找某个数据是否在给定的数组中,我们同样也可以利用这个思想. 二分查找针对的是一个有序的数

【Java数据结构学习笔记之二】Java数据结构与算法之队列(Queue)实现

  本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设置与实现双链表实现 队列的抽象数据类型   队列同样是一种特殊的线性表,其插入和删除的操作分别在表的两端进行,队列的特点就是先进先出(First In First Out).我们把向队列中插入元素的过程称为入队(Enqueue),删除元素的过程称为出队(Dequeue)并把允许入队的一端称为队尾,允许出的的一端称为队头,没有任何元素的队列