zoukankan      html  css  js  c++  java
  • 二分查找法

    一、算法思想:

      对于一个已经排序好的序列(使用二分查找法的前提条件,在本篇文章中假设序列是升序排列的),在查找某个元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止。如果查到了这个元素,返回元素所在的序列的位置,如果没有查到,返回-1。

    二、程序实现:

     《二分查找学习札记》这篇博客详细讲解了二分查找法以及常见的主要问题,链接:http://www.cppblog.com/converse/archive/2009/10/05/97905.html

    三、附上JAVA版的用迭代方式和递归方式实现二分查找算法:

      

    public class BinSearch {
        public static void main(String[] args) {
            int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
            int searchNum = 8;
            //调用方法查找:
            //1、迭代方式:
            int returnNum_iteration = binarySearch_iteration(array, searchNum);
            System.out.print("迭代方式的输出结果:");
            System.out.println("要查找的元素在数组的下标:" +  returnNum_iteration);
    
            //2、递归方式:
            int returnNum_recurse = binarySearch_recurse(array, searchNum, 0, array.length - 1);
            System.out.print("递归方式的输出结果:");
            System.out.println("要查找的元素在数组的下标:" + returnNum_recurse);
        }
    
        //迭代方式实现二分查找
        public static int binarySearch_iteration(int[] array, int searchNum) {
            int low=0;
            int high=array.length-1;
            int middle=0;
            while (low <= high) {
                middle = low + (high - low) / 2;   // int middle = (low + high) / 2;
                if (searchNum == array[middle]) {
                    return middle;
                } else if (searchNum > array[middle]) {
                    low=middle+1;
                } else {
                    high=middle-1;
                }
            }
            return -1;
        }
        
    
        //递归方式实现二分查找
    
        public static int binarySearch_recurse(int[] array, int searchNum, int low, int high) {
            if (low <= high) {
                int middle = low + (high - low) / 2;   // int middle = (low + high) / 2;
                if (searchNum == array[middle]) {
                    return middle;
                } else if (searchNum > array[middle]) {
                    return binarySearch_recurse(array, searchNum, middle + 1, high);
                } else {
                    return binarySearch_recurse(array, searchNum, low, middle - 1);
                }
            }
            return -1;
        }
    
    }

    注释:

        1、什么是递归

      递归就是程序不停地间接或者直接调用自身,直到满足条件后退才出的一种算法。下面是递归实现阶乘计算的例子:

      (1)计算n的阶乘的代码:

    public long Factorial(int n) 
    { 
    if (n == 0)//限制条件,对该方法调用自己做了限制 
    return 1; 
    return n * Factorial(n - 1); 
    }

      (2)递归执行图:

                       

  • 相关阅读:
    .NET 6.0 —— 网络监视器 (TODO)
    Google adwords api —— report & AWQL
    Linux 镜像更新 为国内镜像源 for debian
    优化代码 —— 二八法则 & 编完代码,再优化
    鳥哥的 Linux 私房菜 ——— 第十八章、 服务的防火墙管理 xinetd, TCP Wrappers(3)
    端口号port 是什么
    aptget的install、update、upgrade的区别(转发)
    Google ads api —— github
    .net 6.00 —— record 类型 (TODO)
    Compiled models —— .NET Core 6.0
  • 原文地址:https://www.cnblogs.com/hezhiyao/p/7402005.html
Copyright © 2011-2022 走看看