Java中两种基本的查找算法之二分查找

第二种查找算法:二分查找:

/**
* 2. 二分查找(折半查找)
* 基本思想:
* 在有序数组中,取中间数值作为比较对象,若给定值与中间数值相等,则查找成功;
* 若给定值小于中间数值,则在中间数值的左半区继续查找;
* 若给定值大于中间数值,则在中间数值的右半区继续查找。
* 不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。
*
* 时间复杂度:O(log2 n)
*
*/

二分查找示例代码如下:

import java.util.Arrays;
import java.util.Scanner;

/**
 * 2.二分查找(折半查找)
 * 基本思想:
 *  在有序数组中,取中间数值作为比较对象,若给定值与中间数值相等,则查找成功;
 *  若给定值小于中间数值,则在中间数值的左半区继续查找;
 *  若给定值大于中间数值,则在中间数值的右半区继续查找。
 *  不断重复上述过程,直到查找成功,或所查找的区域无记录,查找失败。
 *  
 * 时间复杂度:O(log2 n)  
 *
 */

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+" ");
        }

        //首先对数组进行排序
        Arrays.sort(arr);

        //遍历输出排序好的数组
        System.out.println("\n数组排序后顺序:");
        for(int n : arr){
            System.out.print(n+" ");
        }

        System.out.println("\n请输入你要查找的数字:");
        @SuppressWarnings("resource")
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();

        //调用binarySearch()方法,将返回值保存在result中
        int result = binarySearch(arr, num);
        if(result == -1){
            System.out.println("查找失败!");
        }
        else{
            System.out.println("查找成功,数字位于排序后第"+(result+1)+"位!");
        }

    }

    //折半查找
    private static int binarySearch(int[] arr,int num){

        int lower = 0;
        int upper = arr.length-1;

        while(lower <= upper){ //此处必须用<=,因为有可能相等
            int mid = (upper+lower)/2;
            if(arr[mid] < num){
                lower = mid+1;
            }else if(arr[mid] > num){
                upper = mid-1;
            }else{
                return mid;
            }
        }
        return -1;

    }
}

结果显示:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/jsc123581/article/details/81746493
今日推荐