数据结构与算法分析(Java语言描述)(15)—— 二分查找(递归与非递归)
来源:互联网 发布:asp.net erp源码 编辑:程序博客网 时间:2024/06/05 10:49
非递归
int find(int[] arr, int target){ int l=0, r=arr.length-1; while(l<=r){ int mid = (r-l)/2 + l; if(arr[mid] == target) return mid; if(arr[mid] > target) r = mid-1; if(arr[mid] < target) l = mid+1; } return -1;}
package com.algorithm.search;public class BinarySearchNotRecursive { private BinarySearchNotRecursive() { } // 二分查找法,在有序数组arr中,查找target // 如果找到target,返回相应的索引index // 如果没有找到target,返回-1 public static int find(Integer[] arr, Integer target) { // 在arr[l...r]之中查找target int l = 0, r = arr.length - 1; while (l <= r) { // 防止极端情况下的整形溢出,使用下面的逻辑求出mid int mid = l + (r - l) / 2; if (arr[mid].compareTo(target) == 0) { return mid; } if (arr[mid].compareTo(target) > 0) { r = mid - 1; } else if (arr[mid].compareTo(target) < 0) { l = mid + 1; } } return -1; } // 测试非递归的二分查找算法 public static void main(String[] args) { int N = 1000; Integer[] arr = new Integer[N]; for (int i = 0; i < N; i++) arr[i] = new Integer(i); // 对于我们的待查找数组[0...N) // 对[0...N)区间的数值使用二分查找,最终结果应该就是数字本身 // 对[N...2*N)区间的数值使用二分查找,因为这些数字不在arr中,结果为-1 for (int i = 0; i < 2 * N; i++) { int v = BinarySearchNotRecursive.find(arr, new Integer(i)); if (i < N) { System.out.print(i); System.out.println(v == i); } else { System.out.print(i); System.out.println(v == -1); } } return; }}
递归
int find(int[] arr, int target){ return find(arr, 0, arr.length-1, target);}int find(int[] arr, int l, int r, int target){ if( l > r) return -1; int mid = (r-l)/2 + l; if(arr[mid] == target) return mid; else if(arr[mid] > target) return find(arr, l, mid—1, target); else returnfind(arr, mid+1, r, target);}
package com.algorithm.search;public class BinarySearchRecursive { private BinarySearchRecursive() { } public static int find(Integer[] arr, Integer target) { return find(arr, 0, arr.length - 1, target); } private static int find(Integer[] arr, int l, int r, Integer target) { if (l > r) return -1; // 防止极端情况下的整形溢出,使用下面的逻辑求出mid int mid = l + (r - l) / 2; if (arr[mid].compareTo(target) > 0) { return find(arr, l, mid - 1, target); } else if (arr[mid].compareTo(target) < 0) { return find(arr, mid + 1, r, target); } else { // arr[mid].compareTo(target) == 0 return mid; } } // 测试递归的二分查找算法 public static void main(String[] args) { int N = 1000; Integer[] arr = new Integer[N]; for (int i = 0; i < N; i++) arr[i] = new Integer(i); // 对于我们的待查找数组[0...N) // 对[0...N)区间的数值使用二分查找,最终结果应该就是数字本身 // 对[N...2*N)区间的数值使用二分查找,因为这些数字不在arr中,结果为-1 for (int i = 0; i < 2 * N; i++) { int v = BinarySearchRecursive.find(arr, new Integer(i)); if (i < N) { System.out.print(i); System.out.println(v == i); } else { System.out.print(i); System.out.println(v == -1); } } return; }}
阅读全文
0 0
- 数据结构与算法分析(Java语言描述)(15)—— 二分查找(递归与非递归)
- 《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(非递归)
- 二分查找(递归与非递归)
- 二分查找(递归与非递归)
- 二分查找(递归与非递归)
- 二分查找(递归与非递归)
- 二分查找(递归与非递归)
- 二分查找(递归与非递归)
- 二分查找(递归与非递归)
- 二分查找(递归与非递归)
- 二分查找(递归与非递归)
- 二分查找(递归与非递归)
- 二分查找(递归与非递归)
- 二分查找算法(递归与非递归实现)
- 数据结构与算法(Java描述)-17、递归转化成非递归算法以及迷宫算法
- 数据结构与算法分析(Java 语言描述)(34)—— BST 的深度优先遍历(非递归实现)
- 【数据结构与算法】二分查找递归非递归实现
- java数据结构与算法-递归二分查找
- 消费者调用提供者发生错误
- 《剑指Offer》面试题3及LeetCode中相似题目
- mysql事务隔离级别
- git 多人协作的工作模式
- 在读自考期间,我用VB6.0制作的一个搜索本机文件的软件,小软件,实用。
- 数据结构与算法分析(Java语言描述)(15)—— 二分查找(递归与非递归)
- 逻辑思维1
- Python之json类型数据转换
- golang多核的使用
- 30天高效练习---总览
- 15道使用频率极高的基础算法题
- UGUI灰度处理
- Linux 命令小积累
- 字符串常用的方法(备忘)