二分查找的循环实现和递归实现

自己实现了二分查找的循环实现和递归实现

说明:二分查找适用于顺序存储结构,不适于链式存储结构,是一个高效的查找方法。虽然折半查找效率高,但是要排序,排序本身是一种很费时的运算。

要求传入的表是有序的。

二分查找的过程可用二叉树描述,把当前区间的中点位置上的元素作为根,左子表和右子表中的元素分别作为根的左子树和右子树,由此得到二叉树。

此树称为描述折半查找的判定树或比较树。

package lirui.find;

/**
 * Created by lirui on 14-8-14.
 */
public class BinarySearch {

    /**
     * 二分查找法要求传入的参数是有序的,且从小到大递增。
     * 循环的方式实现。
     *
     * @param list
     * @param key
     * @return
     */
    public static int mybinarySearch(int[] list, int key) {
        int low = 0, high = list.length, mid;
        int n = list.length;
        while (low <= high) {
            mid = (low + high) / 2;
            if (key == list[mid]) {
                return mid;
            }
            if (key < list[mid]) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        return -1;
    }

    // 用递归算法实现二分查找
    public static int mybinarySearchRec(int[] list, int key, int low, int high) {
        int mid;
        if (low <= high) {
            mid = (low + high) / 2;
            if (key == list[mid]) {
                return mid;
            }
            if (key < list[mid]) {
                return mybinarySearchRec(list, key, low, mid - 1);
            } else {
                return mybinarySearchRec(list, key, mid + 1, high);
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        int[] list = {2, 4, 6, 7, 9, 10, 33, 500};
        int result = mybinarySearch(list, 5);
        System.out.println(result);
        int result2 = mybinarySearchRec(list,5,0,7);
        System.out.println(result2);
    }
}

二分查找的循环实现和递归实现

时间: 2024-10-09 23:29:54

二分查找的循环实现和递归实现的相关文章

二分查找【循环和递归】

对一个数组a,在区间下标[x,y]寻找p是否存在,存在则返回下标,否则返回-1. 循环和递归实现:(练习用的程序) 1 #include <stdio.h> 2 #include<stdlib.h> 3 #include<time.h> 4 5 int binSerrch(int a[],int x,int y,int p);//在非递减数组a的x到y区间寻找p,假如存在则返回p的下标,否则返回-1 6 int binSerrch2(int a[],int x,int

二分查找JAVA实现

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表.重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功. 一.概念 二分查

基础算法介绍 —— 二分查找算法

不知不觉在目前的公司待满3年了,打算回家找份工作.面试中被问到关于算法的题目:有哪些常见的查找算法?下来就把我所掌握的查找算法分享给大家,本文主要介绍二分查找算法. 算法定义(摘自百度):二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果

java,二分查找法,网上查阅

二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分.通过一次比较,将查找区间缩小一半. 折半查找是一种高效的查找方法.它可以明显减少比较次数,提高查找效率.但是,折半查找的先决条件是查找表中的数据元素必须有序. 折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除

Java实现二分查找

public class BinarySearch { /** * 二分查找算法 * * @param srcArray 有序数组 * @param key 查找元素 * @return key的数组下标,没找到返回-1 */ public static void main(String[] args) { int srcArray[] = {3,5,11,17,21,23,28,30,32,50,64,78,81,95,101}; System.out.println(binSearch(sr

二分查找算法java

二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分.通过一次比较,将查找区间缩小一半. 折半查找是一种高效的查找方法.它可以明显减少比较次数,提高查找效率.但是,折半查找的先决条件是查找表中的数据元素必须有序. 折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除

Java二分查找算法

二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分.通过一次比较,将查找区间缩小一半. 折半查找是一种高效的查找方法.它可以明显减少比较次数,提高查找效率.但是,折半查找的先决条件是查找表中的数据元素必须有序. 折半查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除

【leetcode边做边学】二分查找应用

更多请关注我的HEXO博客:http://jasonding1354.github.io/ 简书主页:http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles 二分查找 二分查找算法是一种在有序数组中查找某一特定元素的搜索算法.搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束:如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较.如果在某一步骤数组 为

003—二分查找的实现

package oo3_binary_search; import java.util.Arrays; import java.util.Scanner; /** * @author ALazy_cat * 二分查找:要求待查表有序.二分查找的基本思想是将n个元素分成大致相等的两部分,取 a[n/2]与x做比较, * 如果x=a[n/2],则找到x,算法中止:如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则 * 只要在数组a的右半部搜索x. */ public