二分查找算法

改写的二分搜素算法,使得当搜索元素x不在数组中时,返回小于x的最大元素的位置和大于x的最小元素的位置。当搜索的元素在数组中时,i和j相同,均为x在数组中的位置。

/*******************************************************************/

c语言写的代码,有好多不足的地方,各位大佬见笑了

#include<stdio.h>
int main()
{
    int a[10]={1,3,5,7,9,11,12,15,16,20};//数组a为已经排好序的数组
    int n;    //输入的需要查找的数
    int i,j;  //循环下标变量
    printf("请输入需要查询的数据:\n");
    while(~scanf("%d",&n))
    {
        i=0;
        j=sizeof(a)/sizeof(a[0]);     //初始化下标变量,sizeof(a)得到的结果为40,所以需要除以sizeof(a[0])
        while(i<=j)
        {
            int mid=(i+j)/2;
            if(n<a[mid])
                j=mid-1;
            else if(n>a[mid])
                i=mid+1;
            else
            {
                printf("所查找的元素在数组中,其在数组中的下标为%d\n",mid);
                break;
            }
        }
        if(i>j)
        {
            printf("所查找的元素不在数组中:\n");
            printf("数组中小于所查找的%d的最大元素的下标为%d\n",n,j);
            printf("数组中大于所查找的%d的最小元素的下标为%d\n",n,i);
        }
    }
    return 0;
}

/**********************************************************************************/

下面是Java代码的实现。

二分查找的核心代码  (非递归)

  1. while (start <= end) {  
  2.             mid = (end - start) / 2 + start;  
  3.             if (key < srcArray[mid]) {  
  4.                 end = mid - 1;  
  5.             } else if (key > srcArray[mid]) {  
  6.                 start = mid + 1;  
  7.             } else {  
  8.                 return mid;  
  9.             }  
  10.         }
}

二分查找的核心代码  (递归)

  1. public static int binSearch(int srcArray[], int start, int end, int key) {  
  2.         int mid = (end - start) / 2 + start;  
  3.         if (srcArray[mid] == key) {  
  4.             return mid;  
  5.         }  
  6.         if (start >= end) {  
  7.             return -1;  
  8.         } else if (key > srcArray[mid]) {  
  9.             return binSearch(srcArray, mid + 1, end, key);  
  10.         } else if (key < srcArray[mid]) {  
  11.             return binSearch(srcArray, start, mid - 1, key);  
  12.         }  
  13.         return -1;  
  14.     } 


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值