数组查找

线性查找

//线性查找
public static void main(String[] args) {
 String[] arr=new String[] {"AA","BB","CC","DD","DD"};
 String desc="DD";
 boolean isFind=false;
 for(int i=0;i<arr.length;i++) {
  if(desc==arr[i]) {
   System.out.println(i+1);
   isFind=true;
   continue;
  }
  isFind=false;
 }
 if(isFind==false) {
  System.out.println("没找到");
 }
}
}

二分查找


```java


//此版本仅适用于无重复数

   int[] arr=new int[] {1,2,3,4,5,6,7,8,9};

   int desc=4;

   int head=0;

   int end=arr.length-1;

   boolean isFind=false;

   while(head<=end) {

      int middle=(head+end)/2;

      if(desc==arr[middle]) {

          System.out.println("找到了,位置为:"+middle);

          isFind=true;

          //continue;

          break;

      }else if(desc>arr[middle]) {

          head=middle+1;

      }else {

          end=middle-1;

      }

   }

   if(isFind==false) {System.out.println("没找到");}

}

}



当找到了想要查询的值的位置时,查看左右两边的值是否和他相等,相等则把位置记录下来

```java


//二分法查找 有重复数

public static void main(String[] args) {

   int[] arr=new int[] {4,4,4,4,4,5,6,7,8};

   int num1=0;

   int num2=0;

   int head=0;

   int desc=4;

   int end=arr.length-1;

   while(head<=end) {

      int middle=(head+end)/2;

      if(desc==arr[middle]) {

          

          for(int index1=(middle-1);index1>0;index1--) {

          if(arr[index1]!=desc) {

             num1=index1+1;

                break;

             }

      

          }

          for(int index2=(middle+1);index2<(arr.length);index2++) {

          if(arr[index2]!=desc) {

             num2=index2-1;

                break; 

          }

          }

          //针对后面全为目标数的特殊情况

          if(arr[arr.length-1]==desc) {

             num2=arr.length-1;

          }

          //System.out.println(num1);

          //System.out.println(num2);

          System.out.println("找到,位置为:");

          for(int i=num1;i<=num2;i++) {

             System.out.println(i);

          }

          return;

      }else if(desc>middle) {

          head=middle+1;

      }else {

          end=middle-1;

      }

   }

}

}

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值