改写的二分搜素算法,使得当搜索元素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代码的实现。
二分查找的核心代码 (非递归)
- while (start <= end) {
- mid = (end - start) / 2 + start;
- if (key < srcArray[mid]) {
- end = mid - 1;
- } else if (key > srcArray[mid]) {
- start = mid + 1;
- } else {
- return mid;
- }
- }
二分查找的核心代码 (递归)
- public static int binSearch(int srcArray[], int start, int end, int key) {
- int mid = (end - start) / 2 + start;
- if (srcArray[mid] == key) {
- return mid;
- }
- if (start >= end) {
- return -1;
- } else if (key > srcArray[mid]) {
- return binSearch(srcArray, mid + 1, end, key);
- } else if (key < srcArray[mid]) {
- return binSearch(srcArray, start, mid - 1, key);
- }
- return -1;
- }