• Java中常用的查找算法——顺序查找和二分查找


    Java中常用的查找算法——顺序查找和二分查找

    神话丿小王子的博客

    一、顺序查找:

    a) 原理:顺序查找就是按顺序从头到尾依次往下查找,找到数据,则提前结束查找,找不到便一直查找下去,直到数据最后一位。

    b) 图例说明: 原始数据:int[] a={4,6,2,8,1,9,0,3}; 要查找数字:8

    代码演示:

    import java.util.Scanner;
    
    /*
    
     * 顺序查找
    
     */
    
    public class SequelSearch {
    public static void main(String[] arg) {  
        int[] a={4,6,2,8,1,9,0,3};
        Scanner input=new Scanner(System.in);
        System.out.println("请输入你要查找的数:");
        //存放控制台输入的语句
        int num=input.nextInt();
        //调用searc()方法,将返回值保存在result中
        int result=search(a, num);
        if(result==-1){
             System.out.println("你输入的数不存在与数组中。");
        }
        else
             System.out.println("你输入的数字存在,在数组中的位置是第:"+(result+1)+"个");
    }
    public static int search(int[] a, int num) {        
        for(int i = 0; i < a.length; i++) {
            if(a[i] == num){//如果数据存在
                return i;//返回数据所在的下标,也就是位置
            }
        } 
        return -1;//不存在的话返回-1
    }
    }

    运行截图:

     

    二、二分查找

    a) 前提条件:已排序的数组中查找

    b) 二分查找的基本思想是:首先确定该查找区间的中间点位置: int mid = (low+upper) / 2;然后将待查找的值与中间点位置的值比较:若相等,则查找成功并返回此位置。若中间点位置值大于待查值,则新的查找区间是中间点位置的左边区域。若中间点位置值小于待查值,则新的查找区间是中间点位置的右边区域。下一次查找是针对新的查找区间进行的。

    c) 图例说明:

    原始数据: int[] a={5,3,6,1,9,8,2,4,7}; 查找是否存在数字8

    第一步,先用之前学过的排序方法将数组按升序排序:int[] a={1,2,3,4,5,6,7,8,9};

    第二步,取中间数:58比较,8大于,取中间数右侧的数组进行比较,即{6,7,8,9}

    第三步:重复第一步和第二步,直到找到数据或者比较完所有数据。

    d) 代码示例:

    import java.util.Scanner;
    /*
     * 二分查找
     */
    public class BinarySearch {
        public static void main(String[] args) {
            int[] arr={5,3,6,1,9,8,2,4,7};
            //先打印输出原始数组数据
            System.out.println("原始数组数据如下:");
            for (int n : arr) {
                System.out.print(n+" ");
            }
            System.out.println();
            //首先对数组进行排序,这里用冒泡排序
            for(int i=0;i<arr.length-1;i++){
                for(int j=0;j<arr.length-1-i;j++){
                    if(arr[j]>arr[j+1]){
                        int temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                    }
                }
            }
            //遍历输出排序好的数组
            System.out.println("经过冒泡排序后的数组:");
            for(int n:arr){
                System.out.print(n+" ");
            }
            System.out.println();//换行
            Scanner input=new Scanner(System.in);
            System.out.println("请输入你要查找的数:");
            int num=input.nextInt();
            int result=binarySearch(arr, num);
            if(result==-1){
                System.out.println("你要查找的数不存在……");
            }
            else{
                System.out.println("你要查找的数存在,在数组中的位置是:"+result);
            }
        }
        //二分查找算法
        public static int binarySearch(int[] arr,int num){
        
            int low=0;
            int upper=arr.length-1;
            while(low<=upper){
                int mid=(upper+low)/2;
                if(arr[mid]<num){
                    low=mid+1;
                }
                else if(arr[mid]>num){
                    upper=mid-1;
                }
                else
                    return mid;
            }
            return -1;
        }
    }

    运行截图:

     

  • 相关阅读:
    陶瓷电容的结构、工艺、失效模式
    Vue.js最佳实践
    Vue 超快速学习
    CSS 小技巧
    HTML5 Canvas
    webkit下面的CSS设置滚动条
    Some untracked working tree files would be overwritten by checkout. Please move or remove them before you can checkout. View them
    JSCS: Please specify path to 'JSCS' package
    React中ref的使用方法
    React 60S倒计时
  • 原文地址:https://www.cnblogs.com/shen-hua/p/5425179.html
Copyright © 2020-2023  润新知