利用二分法查找一个数字在数组中的位置

本文介绍了一种在有序数组中查找特定元素的二分查找算法,提供了递归与非递归两种实现方式,并给出了具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:有一个升序排列无重复数字的数据,以及一个数字,利用二分法查找数字在数组中的位置,找到则返回其位置号,没找到返回-1.

解答:

通过两种方式实现:第一种方式为递归实现,需要传递数组的头和尾的位置。

[java]  view plain  copy
  1. public class MidFind {  
  2.       
  3.     /** 
  4.      *  
  5.      * @param arr 
  6.      * @param key 
  7.      * @param startNum 数组位置号,为数组下标+1 
  8.      * @param endNum 数组位置号,为数组下标+1 
  9.      * @return 
  10.      */  
  11.     public static int getLocation(int[] arr,int key,int startNum,int endNum) {  
  12.         if (arr==nullreturn -1;  
  13.         int middleNum=(startNum+endNum)/2;  
  14.         System.out.println("中间值:"+middleNum);  
  15.         if (startNum<endNum) {  
  16.             if (key==arr[middleNum]) {  
  17.                 return middleNum+1;  
  18.             } else if (key<arr[middleNum]) {  
  19.                 return getLocation(arr,key,startNum,middleNum);  
  20.             } else {  
  21.                 return getLocation(arr,key,middleNum,endNum);  
  22.             }  
  23.         } else if (startNum==endNum) {  
  24.             return startNum;  
  25.         } else {  
  26.             return -1;  
  27.         }  
  28.     }  
  29.   
  30.     /** 
  31.      * @param args 
  32.      */  
  33.     public static void main(String[] args) {  
  34.         // TODO Auto-generated method stub  
  35.         int[] arr={1,3,4,5,6,7,11,46,255,743,888};  
  36.         int temp=getLocation(arr,11,1,11);  
  37.         System.out.println(temp);  
  38.     }  
  39.   
  40. }  

第二种实现方式为非递归实现,则利用循环:
[java]  view plain  copy
  1. public class MidFind2 {  
  2.   
  3.     public static int getLocation(int[] arr,int key) {  
  4.         if (arr==nullreturn -1;  
  5.         int middleNum=arr.length/2;  
  6.         if (key==arr[middleNum]) {  
  7.             return middleNum+1;  
  8.         }  
  9.         int startNum=0//数组下标  
  10.         int endNum=arr.length-1//数组下标  
  11.         while (startNum<=endNum) {  
  12.             middleNum=(startNum+endNum)/2;  
  13.             if (key<arr[middleNum]) {  
  14.                 endNum=middleNum;  
  15.             } else if (key>arr[middleNum]) {  
  16.                 startNum=middleNum;  
  17.             } else {  
  18.                 return middleNum+1;  
  19.             }  
  20.         }  
  21.         return -1;  
  22.     }  
  23.     /** 
  24.      * @param args 
  25.      */  
  26.     public static void main(String[] args) {  
  27.         // TODO Auto-generated method stub  
  28.         int[] arr={1,3,4,5,6,7,11,46,255,743,888};  
  29.         int temp=getLocation(arr,5);  
  30.         System.out.println(temp);  
  31.     }  
  32.   
  33. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值