数据结构——二分搜索

递归实现

/**
 * 二分搜索(递归实现)
 * @param A     待搜索数组
 * @param num   搜索值
 * @param left  区间左指针
 * @param right 区间右指针
 * @param mid   基准
 */
private static void search(int[] A, int num, int left, int right, int mid) {
    if (A[mid] == num) { // 如果找到要找的数,记录其下标
        res = mid;
    }
    if (left >= right)
        return ;
    if (A[mid] >= num) { // 出现在左边
        right = mid - 1;
        mid = left + (right-left)/2;
        search(A, num, left, right, mid);
    }
    if (A[mid] < num) { // 出现在右边
        left = mid + 1;
        mid = left + (right-left)/2;
        search(A, num, left, right, mid);
    }
}

非递归实现

/**
 * 二分搜索(非递归实现)
 * @param A     带搜索数组
 * @param n     数组长度
 * @param num   搜索值
 * @return
 */
private static int search2(int[] A, int n, int num) {
    int left = 0;
    int right = n - 1;
    int res = -1;
    while (left <= right) {
        int mid = left + (right - left)/2;
        if (A[mid] == num) {
            res = mid;
            right = mid - 1;
        }
        if (A[mid] >= num) { // 左区间
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    return res;
}

private static int search3(int[] arr, int n, int num) {
    int left = 0;
    int right = n-1;
    while (left <= right) {
        int mid = left + ((right-left)>>1);
        if (arr[mid] > num) {
            right = mid-1;
        }else if (arr[mid] < num) {
            left = mid+1;
        }else {
            return mid;
        }
    }
    return -1;
}
时间: 2024-10-11 06:50:26

数据结构——二分搜索的相关文章

数据结构与算法(4)-----&gt;链表、二分搜索

1.  链表的基本概念 链表和数组一样都是一种线性结构; 数组是一段连续的存储空间; 链表空间不一定保证连续,是临时分配的; 链表的分类 按方向: 单链表:每个节点只能通过next指针指向下一个节点; 双链表:除了可以用next指针之外,还可以用previous指针,指向前一个节点: 按有无环: 普通链表 循环链表(首尾相接的链表,最后一个元素的next指针指向第一个元素;对于双链表,第一个元素的previous指针还需要指向最后一个元素) 2.  单链表的翻转操作 当链表为空或者长度为1时,特

C++数据结构

链表节点 Node T, Node * Stack isEmpty() peek() push() pop() getSize() Queue????enqueue() dequeuer() getSize() 迭代器,对指针进行包装,更加安全 二叉树节点 Node T Node* left Node *right 树的遍历:中序(升)先序(深度优先)后序 广度优先 中+先(后)后(先) BinaryTree????size insert() inorder() preorder() posto

【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会写生产者.消费者问题,完全消化理解) 5. 线程的实现方式. (也就是用户线程与内核线程的区别) 6. 用户态和核心态的区别. 7. 用户栈和内核栈的区别. 8. 内存池.进程池.线程池.(c++程序员必须掌握) 9. 死锁的概念,导致死锁的原因. 10. 导致死锁的四个必要条件. 11. 处理死锁

红黑树数据结构剖析

红黑树是计算机科学内比较常用的一种数据结构,它使得对数据的搜索,插入和删除操作都能保持在O(lgn)的时间复杂度.然而,相比于一般的数据结构,红黑树的实现的难度有所增加.网络上关于红黑树的实现资料汗牛充栋,但是乏于系统介绍红黑树实现的资料.本文通过一个自己实现的红黑树数据结构以及必要的搜索,插入和删除操作算法,为大家更系统地剖析红黑树数据结构的实现. 对于大部分数据结构,一般都会使用抽象数据类型的方式实现,C++提供的模板机制可以做到数据结构与具体数据类型无关,就像STL实现的那样.不过本文并非

Java数据结构学习—Collections类

java.util 类 Collections java.lang.Object java.util.Collections public class Collections extends Object 此类完全由在 collection 上进行操作或返回 collection 的静态方法组成.它包含在 collection 上操作的多态算法,即"包装器",包装器返回由指定 collection 支持的新 collection,以及少数其他内容. 如果为此类的方法所提供的 colle

数据结构与算法分析之----各种常用排序详解

1.选择排序 思想:在需要进行排序的序列中,每次把最小(或最大)的交换到最左边的位置 案例: 待排序数组: 5 2 6 8 4 1 选择过程:    5 2 6 8 4 1 => 2 5 6 8 4 1 => 1 5 6 8 4 2 => 1 4 6 8 5 2 => 1 2 6 8 5 4 => 1 2 5 8 6 4 => 1 2 4 8 6 5... 2.冒泡排序 思想:在需要进行排序的序列中,每次把最小(或最大)的推到最顶端,像气泡一样往上冒 案例: 待排序

数据结构选讲-二叉查找树(Binary Search Tree)

摘要 本文主要讨论的内容包括:BST的性质以及基本操作分析. 作为最基本的数据结构,二叉查找树(后文记为BST)本身不仅易于理解,代码精简,而且通过添加不同的特性,可以实现许多高级的数据结构,例如:添加颜色信息,升级为红黑树:添加高度和平衡信息,升级为AVL树:更改节点数量,成为2-3-4树等更为复杂的数据结构.而正如其名,BST及其变种在搜索领域有不可替代的作用. 二叉查找树概览 二叉查找树的特点及解释 在BST上执行的基本操作与树的高度成正比.对于一棵含n个节点的完全二叉树(perfect

20172332 2017-2018-2 《程序设计与数据结构》第八周学习总结

20172332 2017-2018-2 <程序设计与数据结构>第八周学习总结 教材学习内容总结 第十章多态性 1.后绑定. 效率低于编译阶段的绑定效率. 2.利用继承实现多态性. 3.利用接口实现多态性. 4.排序. 选择法排序.(从左到右扫描到最小的数) 插入法排序.(依次选取数与之前排列好的数列进行比较然后插入) 综合考虑,选择法优于插入法. 5.搜索. 线性搜索. 二分搜索.(必须是按顺序排列好的) 二分搜索的效率高于线性搜索,但是线性搜索的实现比二分搜索简单. 6.多态性设计(多个不

《程序设计与数据结构》第八周学习总结

学号 20172326 <程序设计与数据结构>第八周学习总结 教材学习内容总结 后绑定在程序执行时执行 多态性可由继承与接口实现 排序有选择法排序与插入法排序 搜索分为线性搜索与二分搜索 算法,同一类型的不同方法可能解决同一问题,但是,效率与难以程度不同 教材学习中的问题和解决过程 问题:Java当中的绑定机制 首先,编译时绑定与动态绑定又分别称为前期绑定和后期绑定.前期绑定:在程序执行前方法已经被绑定,此时由编译器或其它连接程序实现.例如:C.后期绑定:在运行时根据具体对象的类型进行绑定.重