zoukankan      html  css  js  c++  java
  • Java BinarySearch

    Java BinarySearch

    /**
     * <html>
     * <body>
     *  <P> Copyright 1994-2018 JasonInternational </p>
     *  <p> All rights reserved.</p>
     *  <p> Created on 2018年4月10日 上午9:46:32</p>
     *  <p> Created by Jason</p>
     *  </body>
     * </html>
     */
    package cn.ucaner.algorithm.search;
    
    /**
     * In computer science, binary search, also known as half-interval search or logarithmic search, is a search algorithm that finds the position of a target value within a sorted array. Binary search 
     * compares the target value to the middle element of the array; if they are unequal, the half in which the target cannot lie is eliminated and the search continues on the remaining half until it is 
     * successful or the remaining half is empty.
     * <p>
     * Worst-case performance      O(log n)<br>
     * Best-case performance       O(1)<br>
     * Average performance         O(log n)<br>
     * Worst-case space complexity O(1)<br>
     * <p>
     * @see <a href="https://en.wikipedia.org/wiki/Binary_search_algorithm">Binary Search (Wikipedia)</a>
     * <br>
     * @author Justin Wetherell <phishman3579@gmail.com>
     */
    public class BinarySearch {
    
        private static final int SWITCH_TO_BRUTE_FORCE = 200;
    
        private static int[] sorted = null;
    
        // Assuming the array is sorted
        public static final int find(int value, int[] array, boolean optimize) {
            BinarySearch.sorted = array;
            try {
                return recursiveFind(value, 0, BinarySearch.sorted.length - 1, optimize);
            } finally {
                BinarySearch.sorted = null;
            }
        }
    
        private static int recursiveFind(int value, int start, int end, boolean optimize) {
            if (start == end) {
                int lastValue = sorted[start]; // start==end
                if (value == lastValue)
                    return start; // start==end
                return Integer.MAX_VALUE;
            }
    
            final int low = start;
            final int high = end + 1; // zero indexed, so add one.
            final int middle = low + ((high - low) / 2);
    
            final int middleValue = sorted[middle];
            if (value == middleValue)
                return middle;
            if (value > middleValue) {
                if (optimize && (end - middle) <= SWITCH_TO_BRUTE_FORCE)
                    return linearSearch(value, middle + 1, end);
                return recursiveFind(value, middle + 1, end, optimize);
            }
            if (optimize && (end - middle) <= SWITCH_TO_BRUTE_FORCE)
                return linearSearch(value, start, middle - 1);
            return recursiveFind(value, start, middle - 1, optimize);
        }
    
        private static final int linearSearch(int value, int start, int end) {
            for (int i = start; i <= end; i++) {
                int iValue = sorted[i];
                if (value == iValue)
                    return i;
            }
            return Integer.MAX_VALUE;
        }
    }
    

      

  • 相关阅读:
    build/envsetup.sh 脚本分析 lunch函数
    DEDE自动审核会员发表的最新文章的修改方法
    php学习笔记(三)――操作符与控制结构
    简单的会话类
    学习PHP几个数学计算的内部函数
    关于gotozf学习笔记(11/08/06 12:07)
    再谈中文分词php类
    原站完整打包PHP+MYSQL,可做仿53客服在线客服系统,多用户多国语言企业版
    白话经典算法系列之二 直接插入排序的三种实现
    php 代码运行时间查看类
  • 原文地址:https://www.cnblogs.com/jasonandy/p/9243219.html
Copyright © 2011-2022 走看看