博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数组的普通查找与折半查找
阅读量:6232 次
发布时间:2019-06-21

本文共 2047 字,大约阅读时间需要 6 分钟。

前提知识:

  

普通查询:本质通过数组的遍历与if逻辑结构判断实现

  实现步骤:

    1. 遍历数组

    2. 遍历过程中,使用元素和数组中的元素进行比较
      如果相同,返回元素在数组中的索引
      如果不同,返回负数

public static int search(int[] arr, int key){  //遍历数组  for(int i = 0 ; i < arr.length ; i++){    //数组元素,被查找的元素比较    if(arr[i] == key){      //返回索引      return i;    }  }  return -1;}

折半查找:前提数组必须为从小到大不重复线性数组!

 

非递归方式:

public static int binarySearch(int[] arr, int key){         //定义三个指针变量 存储 左区间索引 中间索引 右区间索引         int min = 0 ;         int max = arr.length -1 ;         int mid = 0;         //循环折半,条件 min<=max         while( min <= max){             //公式,计算中间索引                    mid = (min+max)/2;             if(key > arr[mid]){                 min = mid + 1;             }else if (key < arr[mid]){                 //元素 < 中间索引  大指针= 中间-1                 max = mid - 1;             }else{                 //元素 == 中间索引  找到了,结束了,返回中间索引                        return mid;             }         }         //循环结束,无法折半,元素没有找到 ,返回-1         return -1;}

JDK1.8的java.utils.Arrays的二分查询底层源码分析

// Like public version, but without range checks.    private static int binarySearch0(int[] a, int fromIndex, int toIndex,int key) {        int low = fromIndex;        int high = toIndex - 1;     //循环折半判断        while (low <= high) {
      //位运算 >>>1 右移一位等效与 /2 int mid = (low + high) >>> 1; int midVal = a[mid]; if (midVal < key) low = mid + 1; else if (midVal > key) high = mid - 1; else return mid; // key found } return -(low + 1); // key not found. }

 

递归方式:

int  binarySearch(int[] arr ,int start ,int end,int key){    int mid = (start+end)/2;   //递归出口1: 左区间索引比右区间索引大    if(start>end){        return -1;    }   //递归出口2:找到对应key值得索引    if(key == arr[mid]){        return mid;    }else if (key > arr[mid]) {        return binarySearch(arr, mid + 1, end, key);    } else {
//if (key < arr[mid]) {
return binarySearch(arr, start, mid - 1, key); }}

 

转载于:https://www.cnblogs.com/qq1452753919/p/10543281.html

你可能感兴趣的文章
Android 内存优化 (防Memory Leak)
查看>>
C++之指针
查看>>
解决linux用户切换失败 su:execute /usr/bin 没有权限
查看>>
[LeetCode]题解(python):100-Same Tree
查看>>
win10 64位 安装scrapy
查看>>
iostat监控磁盘io
查看>>
centos7搭建ANT+jmeter+jenkins接口测试自动化环境
查看>>
分配问题(二部图的最佳匹配 KM) 线性规划与网络流24题
查看>>
Android子线程访问网络
查看>>
The Ninth Hunan Collegiate Programming Contest (2013) Problem J
查看>>
让你的字段支持保存手机中的emoji表情
查看>>
Java 数组
查看>>
金山实习周记(4)——Google Cloud Print
查看>>
[Windows Azure] Windows Azure Execution Models
查看>>
币值转换
查看>>
asp.net程序集冲突解决笔记(未能加载文件或程序集"XXXXXXXXX")
查看>>
memcached循序渐进(一) - 基础概念和安装
查看>>
常用jQuery代码
查看>>
cocos2d-x之逐帧动画
查看>>
asp.net mvc源码分析 - 路由注册
查看>>