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日

悬赏问题

  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助