makabaka## 2022-01-03 11:50 采纳率: 50%
浏览 35
已结题

程序有什么问题吗,折半查找(语言-java)

输入整数判断该整数是否在数组中
//输入整数,判断该整数是否在数组中(折半查找)
import java.util.Scanner;

public class Example2_5 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int start = 0, middle, end;
        int a[] = { 12, 25, 33, -6, 56, 100, -40, 0 };
        // 对数组排序
        for (int i = 0; i < a.length; i++) {
            for (int j = i + 1; j < a.length; j++) {
                if (a[i] > a[j]) {
                    int t = a[i];
                    a[i] = a[j];
                    a[j] = t;
                }
            } //
        }
        Scanner scanner = new Scanner(System.in);
        System.out.println("输入整数,判断该整数是否在数组中");
        int number = scanner.nextInt();
        end = a.length - 1;
        middle = (start + end) / 2;
        while (number != a[middle]) {

            if (number > a[middle]) {
                start = middle + 1;
            }
            if (number < a[middle]) {
                end = middle - 1;
            }
            middle = (start + end) / 2;

            if (start > end) {
                System.out.printf("%d不在数组中", number);
                break;
            }

        }
        if (number == a[middle]) {
            System.out.printf("%d在数组中", number);
        }

    }
}

可以正常运行,但是和书上写的不一样
书上的程序

import java.util.*;
    public class Example2_5_0 {
        public static void main(String[] args) {
            int start=0,end,middle;
            int a[]={12,45,67,89,123,-45,67};
            int N=a.length;
            for(int i=0;i<N;i++){//选择法排序数组
                for(int j=i+1;j<N;j++){
                    if(a[i]>a[j]){
                        int t=a[i];
                        a[i]=a[j];
                        a[j]=t;
                    }
                }
            }
            Scanner scanner=new Scanner(System.in);
            System.out.println("输入一个整数,程序判断该整数是否在数组中");
            int number=scanner.nextInt();
            int count=0;
            end=N;
            middle=(start+end)/2;
            while(number!=middle){
                if(number>a[middle])
                    start=middle;
                else if(number<middle)
                    end=middle;
                middle=(start+end)/2;
                count++;
                if(count>N/2)
                    break;
            }
            if(count>N/2)
                System.out.printf("%d不在数组中.\n",number);
            else
                System.out.printf("%d在数组中.\n",number);
        }
     
    }


start和end取值有问题吗

  • 写回答

1条回答 默认 最新

  • CSDN专家-sinJack 2022-01-03 12:06
    关注

    start和end取值是没问题的。

    //如果要查找的元素number大于中间位置的元素middle,指向数组的较小端的start索引重新指向中间索引middle的右边(middle+1if (number > a[middle]) {
      start = middle + 1;
    }
    //如果要查找的元素number小于中间位置的元素middle,指向数组的较大端的end索引重新指向中间索引middle的左边(middle-1if (number < a[middle]) {
       end = middle - 1;
     }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 1月11日
  • 已采纳回答 1月3日
  • 创建了问题 1月3日

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况