栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

二分法在一个有序数组中找到大于等于某个数的最左侧的位置

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

二分法在一个有序数组中找到大于等于某个数的最左侧的位置

import java.util.Arrays;
import java.util.Random;

public class TwoDivideDemo02 {
    
    public static void main(String[] args) {
        //要求测试50万次
        int testTime = 500000;
        //成功的话succeed=true
        boolean succeed = true;
        //得生成一个随机有序数组,数组的最大长度是maxSize,最大值是maxValue
        int maxSize = 50;
        int maxValue = 100;
        //先写一个随机数产生器
        Random ran = new Random();
        for (int i = 0; i < testTime; i++) {
            //自定义一个方法生成一个随机有序数组
            int[] arr = generateArray(maxSize, maxValue);
            //产生一个要找的数
            int num = ran.nextInt(maxValue)+1;
            //利用二分法找到大于等于这个数的最左侧的位置
            int index1 = erFenMethod(arr, num);
            //利用遍历的方法找到大于等于某个数的最左侧的位置
            int index2 = bianli(arr,num);
            //比较两个方法找到的索引值是否相同
            if(index1 != index2) {
                succeed = false;
                System.out.println("第 "+i+" 次");
                System.out.print("从"+Arrays.toString(arr));
                System.out.println("找"+num);
                System.out.println(index1);
                System.out.println(index2);
                break;
            }
        }
        System.out.println(succeed ? "Nice!" : "Fuck!");

    }


    //定义一个产生随机有序数组的方法
    public static int[] generateArray(int maxSize, int maxValue) {
        Random r = new Random();
        int[] arrayA = new int[r.nextInt(maxSize)+1];  //数组的长度为[1,maxSize]
        //给数组赋值
        for (int i = 0; i < arrayA.length; i++) {
            arrayA[i] = r.nextInt(maxValue)+1;         //每个值的范围是[1,maxValue]
        }
        //给数组排序
        Arrays.sort(arrayA);
        return arrayA;
    }

    //定义一个二分法,找到大于等于这个数的最左侧的位置二分法找到大于等于这个数的最左侧的位置
    public static int erFenMethod(int[] array, int number) {
        int L = 0 ;
        int R = array.length-1;
        int index = -1;
        while(L <= R) {
            int mid = L +( (R-L)>>1 );
            if(array[mid] >= number) {
                index = mid;
                R = mid - 1;
            }
            else if(array[mid] < number) {
                L = mid +1;
            }
        }
        return index;
    }

    //定义一个遍历的方法,找到大于等于某个数的最左侧的位置
    public static int bianli(int[] array, int number) {
        int index = -1;
        for (int i = 0; i < array.length; i++) {
            if(array[i] >= number) {
                index = i;
                break;
            }
        }

        return index;
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/891800.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号