JavaSE语言基础之数组二分法查找

一.概念:

算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。

基本思想:假设数据是按升序排序的,对于给定值key,从序列的中间位置k开始比较,

如果当前位置arr[k]值等于key,则查找成功;

若key小于当前位置值arr[k],则在数列的前半段中查找,arr[low,mid-1];

若key大于当前位置值arr[k],则在数列的后半段中继续查找arr[mid+1,high],

直到找到为止,时间复杂度:O(log(n))。(摘自百度百科)

二.代码

    int[] arr ={3,12,24,36,55,68,75,88};    int low = 0;            int high = arr.length - 1;            int mid = -1;
    while(low <= high) {
        mid = (low + high) / 2;
        if (arr[mid] < value){                   low = mid + 1;               }else if (arr[mid] > value){                  high = mid - 1;           }else{             break;        }
    }
    if (low <= high) {                 System.out.println("可以找到:index = " + mid + "。");
    } else {             System.out.println("无法找到!");           }

执行流程:

1)开始令low=0(指向3),high=7(指向88),则mid=3(指向36)。因为k<mid,故应在前半段中查找。

2)令新的high=mid-1=2(指向24),而low=0(指向3)不变,则新的mid=1(指向12)。此时k>mid,故确定应在后半段中查找。

3)令新的low=mid+1=2(指向24),而high=2(指向24)不变,则新的mid=2,此时k=arr[mid],查找成功。

如果要查找的数不是数列中的数,例如k=25,当第四次判断时,k>mid[2],在后边半段查找,令low=mid+1,即low=3(指向36),high=2(指向24)出现low>high的情况,表示查找不成功。

原文地址:https://www.cnblogs.com/luke-liuqi/p/9308766.html

时间: 2024-07-30 11:34:49

JavaSE语言基础之数组二分法查找的相关文章

黑马程序员-C语言基础:数组和字符串

数组:数组的定义注意点 数组初始化正确写法: int args[5] = {1,23,32,4,5}; int args[5] = {12,23}; int args[5] = {[3]=23, [4]=13};//这种写法也可以,直接给其中角标为3和4的赋值 int args[] = {12,23,32};//中括号中没写数组大小,在大括号中一定要写具体数值 int args['A'] = {2,34,5}; 错误写法: int args[];//这样编译器不知道给你开辟多大的内存空间 int

C语言基础:数组作为函数参数传递演示源码

将做工程过程中常用的内容片段记录起来,如下内容内容是关于C语言基础:数组作为函数参数传递演示的内容,应该能对小伙伴也有好处. #include <stdio.h> void show_array(int values[], int number_of_elements) { int i; printf("About to display %d valuesn", number_of_elements); for (i = 0; i < number_of_elemen

GO学习-(8) Go语言基础之数组

Go语言基础之数组 Array(数组) 数组是同一种数据类型元素的集合. 在Go语言中,数组从声明时就确定,使用时可以修改数组成员,但是数组大小不可变化. 基本语法: // 定义一个长度为3元素类型为int的数组a var a [3]int 数组定义: var 数组变量名 [元素数量]T 比如:var a [5]int, 数组的长度必须是常量,并且长度是数组类型的一部分.一旦定义,长度不能变. [5]int和[10]int是不同的类型. var a [3]int var b [4]int a =

java语言在某个数组中查找某个字符出现的次数

package com.llh.demo; import java.util.Scanner; /** * * @author llh * */ public class Test { /* * 在某个字符数组中查找某个字符出现的次数 */ public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入一个字符:"); char a = sc.ne

Java - JavaSE - 语言基础

语言基础 算术运算符 注意:算法(第四版)中指出 +.-.*./ 都是被重载过的 Java 语言规范规定,在逻辑运算符中,! 拥有最高的优先级,之后是 &&,接下来是 || %,如果对负数取模,可以把模数负号忽略不计. System.out.println(5 % -2); //1 System.out.println(-5 % 2); //-1 System.out.println(-5 % -2); //-1 System.out.println(5 % 2); //1 基本数据类型

C语言基础概要----数组

1.数组 数组的地址就是第一个元素的首地址,数组的名字,就代表数组的地址,且是一个常量: 数组小标:元素在数组中的位置,是由下标来表示的,且下表从零开始,所以数组的下标最大值只能为数组的长度减一,使用过程中注意下表不要越界: 数组初始化 (1)直接给所有元素赋值 (2)给部分元素赋值,未赋值的元素默认为零: (3)直接省略长度,大括号里的元素个数就是数组的长度: 数组中的重要使用方法<冒泡排序>:假设数组有n个元素,那么最外层循环(控制循环比较多少次)变量(i)需要i<n-1,里层的循环

C语言基础五 数组的应用

.根据用户输入的10人成绩并将其保存到数组中,求最高成绩,最低成绩和平均成绩 int scoure[10];//存储10个数据的数组 int i; int sum;//总成绩 int max,min,avg;//最大值,最小值,平均成绩 for(i=0;i<10;i++){ printf("请输入%d个成绩",i+1);//获取用户输入的值 scanf("%d",&scoure[i]); sun+=scoure[i]//总成绩 }avg=sum/10;

js脚本语言基础和数组

js和PHP中,字符串赋值:要使用"双引号"或"单引号"引起来:例如:var c="你好"不同类型进行数学运算,要转换,类型转换:强制转换parseInt{c}---转换成整数.parseFloat{}---转换小数运算符表达式:数学运算符:加.减.乘.除.取余逻辑运算符:并(&&):两个条件必须同时成立:或(||):两个条件其中一个条件满足:非(!):原来是真值 加上非就成了假值.比较运算符:等于(==)恒等于(===)不等于(

C语言基础(10)-数组

一.数组的定义 数组就是在内存中连续的相同类型的变量空间. 二.数组在内存中的存储方式 同一个数组所有的成员都是相同的数据类型,同时所有的成员在内存中的地址是连续的,数组名是一个地址的常量,代表数组中首元素的地址. 三.数组的初始化 3.1 一维数组初始化 int a[10] = { 1, 2, 3 }; int a[10] = { 0 }; int a[10] = {1,2,3,4,5,6,7,8,9,10}; int a[] = {1,2,3,4,5,6,7,8,9,10}; // 此写法与