• 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();
        }
    }

     

  • 相关阅读:
    好记性不如烂笔头-linux学习笔记2kickstart自动化安装和cacti
    好记性不如烂笔头-linux学习笔记1
    关于TP5中的依赖注入和容器和facade
    vbs 脚本2
    vbs脚本
    Memcache 和 Radis 比较
    MongoDB 索引的使用, 管理 和优化
    mysql大数据高并发处理
    sql处理高并发
    LB 负载均衡的层次结构
  • 原文地址:https://www.cnblogs.com/200911/p/3896465.html
Copyright © 2020-2023  润新知