在数组中使用二分法查找

package com.db2;

import java.util.Arrays;

/**
 * 二分法查找
 *
 * @author denny 使用二分法查找的前提数组已经排过序
 *
 */
public class Demo4 {

    public static void main(String[] args) {
        int[] arr = { 3, 1, 8, 2, 9, 100, 33, 22, 11, 18, 14, 17, 15, 3 };
        // 使用Arrays.sort()排序
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
        // 返回结果
        //int index = brinarySearch(arr, 99);
        int index = brinarySearch_2(arr, 11);
        System.out.println("index=" + index);

    }

    /*
     * 二分法查找一返回下标如果是-1就说明没有
     */
    public static int brinarySearch(int[] arr, int key) {// 数组和要查找的数
        int min = 0; // 最小的下标
        int max = arr.length - 1;// 最大的下标
        int mid = (min + max) / 2;// 中间的下标
        while (arr[mid] != key) {
            if (key > arr[mid]) { //比中间数还在
                min = mid + 1;   //最小的下标=中间下标加一
            } else if (key < arr[mid]) {//比中间数还小
                max = mid - 1;   //最大的下标=中间下标-1
            }
            if(max<min){
                return -1;
            }
            mid=(min+max)/2; //再次计算中间下标
        }

        return mid;
    }
    /*
     * 二分法查找一返回下标如果是-1就说明没有
     */
    public static int brinarySearch_2(int[] arr, int key) {// 数组和要查找的数
        int min = 0; // 最小的下标
        int max = arr.length - 1;// 最大的下标
        int mid = (min + max) / 2;// 中间的下标

        while(min<=max){
            if(key>arr[mid]){
                min=mid+1;
            }else if(key<arr[mid]){
                max=mid-1;
            }else{
                return mid;
            }
            mid=(min+max)/2;
        }
        //没找到
        return -1;

    }

}
时间: 2025-01-31 03:52:00

在数组中使用二分法查找的相关文章

Java中的二分法查找算法

[ 什么是二分查找 ]  二分查找又称为折半查找,该算法的思想是将数列按序排列,采用跳跃式方法进行查找,即先以有序数列的中点位置为比较对象, 如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分.以此类推不断缩小搜索范围. [ 二分查找的条件 ] 二分查找的先决条件是查找的数列必须是有序的. [ 二分查找的优缺点 ] 优点:比较次数少,查找速度快,平均性能好: 缺点:要求待查数列为有序,且插入删除困难: 适用场景:不经常变动而查找频繁的有序列表. [ 算法步骤描述 ] ①

算法—8.有序数组中的二分查找

1.具体算法 /** * 算法3.2 二分查找(基于有序数组) * Created by huazhou on 2015/11/29. */ public class BinarySearchST<Key extends Comparable<key>, Value> { private Key[] keys; private Value[] vals; private int N; public BinarySearchST(int capacity){ keys = (Key[

有序数组中的二分查找

最近看一些算法题发现这些问题到最后落实到编程实现上都是一种基础的体现,包括对基本的for,if,else,while等语句的理解程度,还有对循环递归的理解.所以还是得回归最基本的算法,现在去学习那些高深复杂的DP,KMP,红黑树未免有点好高骛远.目前应该坚持基础,打好基础,毕竟不是CS科班出身.言归正传,二分查找就是一个最基础的算法.它的时间复杂度O(logn).分为迭代实现和递归实现两种,如下:程序没有经过很多测试,应该有bug,欢迎指正. int BinarySearch(int * a,

数组应用之————二分法查找

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace _99 { class Program { static void Main(string[] args) { int[] dns = new int[] { 3, 8, 9, 10, 16, 28, 36, 42, 58, 79, 98, 99 }; Console.Write("输入你要查找的数&quo

数组拷贝,二分法查找

Arrays.copyOfRange(int[] arr,int开始下标,int结束下标)//左闭右开 System.arraycopy(int[] source,int开始下标,int[] dest,int开始下标,int拷贝多少个) 这里是手动拷贝: public static int[] copyOf(int[] original, int newLength) { int[] dest = new int[newLength]; int length = original.length

《剑指Offer》面试题:二维数组中的查找

题目 题目:在一个二维数组中,每一行都按照从左到右的顺序进行了排序,每一列都按照从上到下进行了排序. 输入这样的一个二维数组arr和一个整数k,判断数组中是否存在这个数. 思路 由于数组时有序的这样一个前提,因此 从右上角开始查找 :如果要查找的数比右上角的值大,则查找范围删除掉(并不是实际的删除,只需要改变下标即可)这一行,如果要查找的数比右上角的值小,则查找范围删除掉这一列:这样就可以将查找范围逐渐缩小,直至完成搜索 当然也可以从右下角开始查找,但是不可以从左上角或者是左下角开始查找(因为这

经典算法题-基础-二维数组中的查找

目录 问题描述 解题思路 相关代码 问题描述 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 要求 时间限制:1秒 空间限制:32768K 方法原型 public boolean find(int target, int [][] array) 输入输出例子 在以下二维数组中 { {1,2,8,9}, {2,4,9,12}, {4,7,10,

C++ STL中的二分查找

这篇博客转自爱国师哥,这里给出连接https://www.cnblogs.com/aiguona/p/7281856.html 一.解释 以前遇到二分的题目都是手动实现二分,不得不说错误比较多,关于返回值,关于区间的左闭右开等很容易出错,最近做题发现直接使用STL中的二分函数方便快捷还不会出错,不过对于没有接触过的同学,二分函数确实是一个头疼的部分,自己查的内容又有点乱,找不到具体的使用方法,有必要自己总结一份完整的以后备用. 二.常用操作 1.头文件 #include <algorithm>

笔试算法题(28):删除乱序链表中的重复项 &amp; 找出已经排好序的两个数组中的相同项

出题:给定一个乱序链表,节点值为ASCII字符,但是其中有重复项,要求去除重复项并保证不改变剩余项的原有顺序: 分析:创建一个256(2^8)大小的bool数组,初始化为false,顺序读取链表,将字母对应位置为false的重新标记为true并保留节点,将字母对 应位置为true的保持并删除节点:时间复杂度为O(N),空间复杂度为常量.注意删除节点和不删除节点的情况下,pre和cur的移动操作不相同: 解题: 1 struct Node { 2 char value; 3 Node* next;