Binary Search in Java

时间:2022-09-22 17:30:26

  关于折半查找中的几个注意点.

Version 1:

public static <T extends Comparable<? super T>> int binSearch(T[] arr,
T element) {
int length = arr.length;
int middle = length / 2;
int index;
if (length == 0) {
return -1;
}
if (arr[middle].compareTo(element) == 0) {
index = middle;
} else if (arr[middle].compareTo(element) < 0) {
index = middle
+ 1
+ binSearch(Arrays.copyOfRange(arr, middle + 1, length),
element);
} else {
index = binSearch(Arrays.copyOfRange(arr, 0, middle), element);
}
return index;
}

  要保证接口为binSearch(array, target),所以此处使用了Arrays.copyOfRange()--导致造成了额外的空间消耗(创建新的数组)。

Version 2:

// 注意这种切换接口的方式
public static <T extends Comparable<? super T>> int binSearch_JDK(T[] arr,
T element) {
//With Recursion
return binSearch_JDK(arr, 0, arr.length - 1, element);
} // With Recursion
public static <T extends Comparable<? super T>> int binSearch_JDK(T[] arr, int start, int end, T element) {
if(start > end){
return -1;
}
int middle = (start + end) / 2;
if(arr[middle].compareTo(element) == 0){
return middle;
}else if(arr[middle].compareTo(element) < 0){
return binSearch_JDK(arr, middle + 1, end, element);
}else{
return binSearch_JDK(arr, 0, middle - 1, element);
}
}

  保证了接口原型不变,而且没有额外的空间消耗(创建新的数组)。注意这种切换接口的方式。

Version 3:

// 注意这种切换接口的方式
public static <T extends Comparable<? super T>> int binSearch_JDK(T[] arr,
T element) {
//Without Recursion
return binarySearch(arr, 0, arr.length - 1, element);
} // JDK SOURCE CODE jdk没有使用泛型,而是直接使用了long
// 能不用递归就不要用
public static <T extends Comparable<? super T>> int binarySearch(T[] arr, int start, int end, T element) {
int middle = start;
while(start <= end){
//middle = (start + end) / 2;
middle = (start + end) >>> 1;
if(arr[middle].compareTo(element) == 0){
return middle;
}else if(arr[middle].compareTo(element) < 0){
start = middle + 1;
}else{
end = middle - 1;
}
}
return -1;
}

  这种方法相对于前2种方法要好很多:接口原型不变,而且没有额外的空间消耗(创建新的数组)并且没有使用递归。

Binary Search in Java的更多相关文章

  1. 数据结构之Binary Search Tree &lpar;Java&rpar;

    二叉查找树简介 二叉查找树(Binary Search Tree), 也成二叉搜索树.有序二叉树(ordered binary tree).排序二叉树(sorted binary tree), 是指一 ...

  2. leetcode 99 Recover Binary Search Tree ----- java

    Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...

  3. leetcode 98 Validate Binary Search Tree ----- java

    Given a binary tree, determine if it is a valid binary search tree (BST). Assume a BST is defined as ...

  4. leetcode 96 Unique Binary Search Trees ----- java

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  5. LeetCode算法题-Binary Search(Java实现)

    这是悦乐书的第297次更新,第316篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第165题(顺位题号是704).给定n个元素的排序(按升序)整数数组nums和目标值,编 ...

  6. leetcode 109 Convert Sorted List to Binary Search Tree ----- java

    Given a singly linked list where elements are sorted in ascending order, convert it to a height bala ...

  7. leetcode 108 Convert Sorted Array to Binary Search Tree ----- java

    Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 给一 ...

  8. 二分查找(binary search)java实现及时间复杂度

    概述 在一个已排序的数组seq中,使用二分查找v,假如这个数组的范围是[low...high],我们要的v就在这个范围里.查找的方法是拿low到high的正中间的值,我们假设是m,来跟v相比,如果m& ...

  9. Convert Sorted List to Binary Search Tree java

    public TreeNode sortedListToBST(ListNode head) { if(head==null) return new TreeNode(0); ArrayList&lt ...

随机推荐

  1. controller共享数据

    刚开始使用angularjs,能感受到他的强大,也在学习的途中遇到一些问题 一般我们在angularjs*享数据使用DI的方法,具体代码如下: <script> angular.modu ...

  2. HTML中的IE条件注释

    IE条件注释是一种特殊的HTML注释,这种注释只有IE5.0及以上版本才能理解.比如普通的HTML注释是: <!--This is a comment--> 而只有IE可读的IE条件注释是 ...

  3. Codeforces 628D 数位dp

    题意:d magic number(0<=d<9)的意思就是一个数,从最高位开始奇数位不是d,偶数位是d 题目问,给a,b,m,d(a<=b,m<2000)问,a,b之间有多少 ...

  4. HttpGet 请求

    import java.net.HttpURLConnection; import java.text.SimpleDateFormat; import java.util.Calendar; imp ...

  5. Java注释用处

    1.Java注释: import cn.lonecloud.Doc; /** * Created by lonecloud on 2017/8/17. * 测试注释类型 {@link Doc#test ...

  6. 一文讲透静电放电(ESD)保护(转发)

    一直想给大家讲讲ESD的理论,很经典.但是由于理论性太强,任何理论都是一环套一环的,如果你不会画鸡蛋,注定了你就不会画大卫. 先来谈静电放电(ESD: Electrostatic Discharge) ...

  7. 连续多次调用inet&lowbar;ntoa&lpar;&rpar;结果重复

    #include <stdio.h> #include <stdlib.h> #include <string.h> #include <pcap.h> ...

  8. ATM实验感受

    public class Account { private String accountID; private String accountname; private String operated ...

  9. 来一波全套向量运算&lpar;C&plus;&plus;&rpar;

    //头文件要求 #include <cmath> struct P{long long x, y;}p[N]; //加法 P operator +(P x, P y){return (P) ...

  10. python实现关键词提取

    今天我来弄一个简单的关键词提取的代码 文章内容关键词的提取分为三大步: (1) 分词 (2) 去停用词 (3) 关键词提取 分词方法有很多,我这里就选择常用的结巴jieba分词:去停用词,我用了一个停 ...