算法之二分查找(进阶版 java/c++)
来源:互联网 发布:linux 卸载 工具 编辑:程序博客网 时间:2024/06/11 08:18
java版(非递归和·递归的方法返回查找到的第一个或最后一个相同元素值索引
import edu.princeton.cs.algs4.StdOut;public class Main { // 非递归版 返回第一个相同值索引 public static int BSearch_F(int key,int[] a) { int lo = 0; int hi = a.length - 1; while (lo < hi) { int mid = lo + (hi - lo) / 2; if (key <= a[mid]) hi = mid; else lo = mid + 1; } if (a[lo] == key) return lo; return -1; } // 非递归版 返回最后一个相同值索引 public static int BSearch_L(int key,int[] a) { int lo = 0; int hi = a.length - 1; while (lo + 1 < hi) { int mid = lo + (hi - lo) / 2; if (key >= a[mid]) lo = mid; else hi = mid - 1; } if (a[hi] == key) return hi; else if (a[lo] == key) return lo; return -1; } //递归版 返回第一个相同值索引 public static int rank_F(int key,int[] a) { return rank_F(0,a.length - 1,key,a); } public static int rank_F(int lo,int hi,int key,int[] a) { int mid = lo + (hi - lo) / 2; if (lo < hi) { if (key > a[mid]) return rank_F(mid + 1,hi,key,a); else return rank_F(lo,mid,key,a); } else if (a[lo] == key) return lo; else return -1; } // 递归版 返回最后一个相同值索引 public static int rank_L(int key,int[] a) { return rank_L(0,a.length,key,a); } public static int rank_L(int lo,int hi,int key,int[] a) { if (lo + 1 < hi) { int mid = lo + (hi - lo) / 2; if (key >= a[mid]) return rank_L(mid,hi,key,a); else return rank_L(lo,mid - 1,key,a); } else if (a[hi] == key) return hi; else if (a[lo] == key) return lo; else return -1; } public static void main(String[] args) { int[] a = {1,2,3,4,4,4,5,6,7,8,9}; StdOut.println("非递归版二分查找第一个相同值索引 " + BSearch_F(4,a)); StdOut.println("非递归版二分查找最后一个相同值索引 " + BSearch_L(4,a)); StdOut.println("递归版二分查找第一个相同值索引 " + rank_F(4,a)); StdOut.println("递归版二分查找最后一个相同值索引 " + rank_L(4,a)); }}
运行:
c++版:
#include <iostream>using namespace std;// 非递归版 返回第一个相同值索引int BSearch_F(int key, int a[], int size){ int lo = 0; int hi = size - 1; while (lo < hi) { int mid = lo + (hi - lo) / 2; if (key <= a[mid]) hi = mid; else lo = mid + 1; } if (a[lo] == key) return lo; return -1;}// 非递归版 返回最后一个相同值索引int BSearch_L(int key, int a[], int size){ int lo = 0; int hi = size - 1; while (lo + 1 < hi) { int mid = lo + (hi - lo) / 2; if (key < a[mid]) hi = mid - 1; else lo = mid; } if (a[hi] == key) return hi; else if (a[lo] == key) return lo; else return -1;}//递归版 返回第一个相同值索引int BSRecursion_F(int lo, int hi, int key, int a[]){ if (lo < hi) { int mid = lo + (hi - lo) / 2; if (key <= a[mid]) return BSRecursion_F(lo, mid, key, a); else return BSRecursion_F(mid + 1, hi, key, a); } if (a[lo] == key) return lo; else return -1;}int BSRecursion_F(int key,int a[],int size){ return BSRecursion_F(0, size - 1,key, a);}// 递归版 返回最后一个相同值索引int BSRecursion_L(int lo, int hi, int key, int a[]){ if (lo + 1 < hi) { int mid = lo + (hi - lo) / 2; if (key < a[mid]) return BSRecursion_L(lo, mid - 1, key, a); else return BSRecursion_L(mid, hi, key, a); } else if (a[hi] == key) return hi; else if (a[lo] == key) return lo; else return 0;}int BSRecursion_L(int key, int a[], int size){ return BSRecursion_L(0, size - 1, key, a);}int main(){ int a[10] = { 0,1,2,4,4,4,4,7,8,9 }; cout <<"非递归查找第一个元素索引 " << BSearch_F(4, a, 10) << endl; cout << "非递归查找最后一个元素索引 " << BSearch_L(4, a, 10) << endl; cout << "递归查找第一个元素索引 " << BSRecursion_F(4, a, 10) << endl; cout << "递归查找最后一个元素索引 " << BSRecursion_L(4, a, 10) << endl; system("pause"); return 0;}
阅读全文
0 0
- 算法之二分查找(进阶版 java/c++)
- java算法之二分查找
- Java-算法之二分查找
- java算法之二分查找
- Java算法之二分查找算法
- 算法之二分查找【C语言】
- 二分查找算法(Java版)
- 算法四 二分查找 java,c,c++
- C 二分查找算法
- c 二分查找算法
- [C]算法 - 二分查找
- C 二分查找算法
- C 二分查找算法
- 数据结构和算法设计专题之---二分查找(Java版)
- 数据结构和算法设计专题之---二分查找(Java版)
- 算法之二分查找(java版实现加测试)
- Java排序算法之二分查找
- 算法学习之java实现二分查找
- python2.7安装mysql的数据驱动
- find与逻辑关系运算
- Event事件对象之动画事件和过渡事件
- 如何自己设计一个高效类似于HashMap的容器
- CSU1561 (More) Multiplication
- 算法之二分查找(进阶版 java/c++)
- 工作小结--关联表的(可为空的情况下)条件添加
- 同步的三种方式:volatile、锁、final
- php的数据类型总结
- scala 随笔(8)list 源码解析
- JMock实践---(六)方法调用次数
- Spring Boot浅谈(是什么/能干什么/优点和不足)
- F
- OneDrive卸载后重新安装没有反应的解决办法