
public class BinarySearchDemo {
public static void main(String[] args) {
int[] a = new int[]{1,5,7,9,11,18,23,48,69};
int point = new BinarySearchDemo()binarySearch(a, 23);
if(point == -1)
Systemoutprintln("在数组中未查找到数23");
else
Systemoutprintln("数字23是数组中第 " + (point + 1) + " 位数");
}
/
二分法查找一个整数在整型数组中的位置
算法思路:首先得到数组a的最小值和最大值的下标,分别是:low和high,接着求出值位于数组中间那个数的下标middle
然后再将这个middle对应的数组中的数和待查找的数num进行比较,如果相等,则表示已查找到,如果num < a[middle]
则说明num位于a[low]和a[middle]之间,于是将a[middle - 1]设为较大值,继续求出此时对应的a[middle],
再进行比较,其他情况可依次类推。一直到low=high,如果此时还没有在数组a中查找到,则说明该数组a中没有值num,返回-1
@param a 给定的整型数组
@param num 待查找的数 num
@return 返回整数num在数组a中的位置下标,如果未查找到则返回-1
/
public int binarySearch(int[] a,int num){
int low = 0;
int high = alength - 1;
while(low <= high){
int middle = (low + high) / 2;
if(num == a[middle])
return middle;
else if(num < a[middle])
high = middle - 1;
else
low = middle + 1;
}
return -1;
}
}
程序基本上就是这样了,其中注释中有详细的解释说明
楼主你好
你的问题在于:
用于二分查找的数组一般是已经排好序的数组
如果单纯的在数组中求最大值或最小值,在数据量不大的情况下可以直接用循环来做如果数据量稍大,请采用二叉树进行存储
分析楼主的代码可知:
在判断a[low] < a[high]时逻辑应该是已经排好序的
按照你输入的数据,在第一次可能就会退出!
此程序人有一个问题 需测试才能发现
int i,x=2;
int a[11]={1,3,5,6,8,11,15,20,26,41};
此时便会出现错误
任待完善。。。
说”二分查找法只适用于顺序存储的有序表“是正确的。
说”指线性表中的元素按值非递减排列(即从小到大,但允许相邻元素值相等)“是为了程序的确定性,实际上只要有序就可以,按递减排序也可以用二分法。
这个跟二分法解方程本质一样
1,给定一个较小的n1和较大的n2(比如1和10)
2,显然初始的3的n1次方小于27,2的n2次方大于27
3,然后求出n1和n2的中值n3(取整),计算3的n3次方,将其与27比较
4,如果=27,则程序结束,n3即为所求,否则到5
5,如果大于27,令n2=n3,否则n1=n3,返回3
这个程序中,函数Insert()是你的要求结果。主函数用于测试说明,可以自行更改。
#include<stdioh>
#define MAX 100
typedef struct
{
int data[MAX];
int length;
} Qlist;
int Insert(int x, Qlist L);
int main()
{
Qlist L;
int i, num;
printf("Please input the number of the digit:\n");
scanf("%d", &Llength);
printf("Please input the digit:\n");
for(i = 0; i < Llength; i++)
{
scanf("%d", &Ldata[i]);
}
printf("Please input the digit you would like to insert:\n");
scanf("%d", &num);
Insert(num, &L);
for(i = 0; i < Llength; i++)
{
printf("%d ", Ldata[i]);
}
return 0;
}
int Insert(int x, Qlist L)
{
int i;
int low = 0;
int high = L->length - 1;
int mid;
for(mid = (low + high) / 2; low < high; mid = (low + high) / 2)
{
if(L->data[mid] < x)
{
low = mid + 1;
}
else if(L->data[mid] > x)
{
high = mid - 1;
}
}
for(i = L->length - 1; i > low; i--)
{
L->data[i + 1] = L->data[i];
}
if(L->data[i] < x)
{
L->data[i + 1] = x;
}
else
{
L->data[i + 1] = L->data[i];
L->data[i] = x;
}
L->length++;
return 0;
}
//其中的冒泡排序的算法如下修改
#include<stdioh>
struct list_type
{
int key;
}s[7]={{25},{57},{48},{37},{12},{96},{86}};
int main()
{
void maopao(struct list_type s[],int n);
maopao(s,7);
for(int i=0;i<7;i++)
printf("%4d",s[i]key);
//int bin_search(list_type s[],int k,int n);
//bin_search(s,86,7);
printf("\n");
return 0;
}
//冒泡法排序函数
void maopao(struct list_type s[],int n)
{
int i,j,flag;
struct list_type swap;
for(i=1;i<n;i++)//此处修改
{
flag=0;
for(j=0;j<n-i;j++)
if(s[j]key>s[j+1]key)
{
flag=1;
swap=s[j];
s[j]=s[j+1];
s[j+1]=swap;
}
if (flag==0)
break;
}
}
//希望能够帮到你 望采纳
以上就是关于对一个数组进行二分查找为什么奇数偶数没影响全部的内容,包括:对一个数组进行二分查找为什么奇数偶数没影响、c++二分查找问题,求一组循环数的最大最小值,请高手指点迷津、利用二分查找算法在一个有序表中插入一个元素x,并保持表的有序性。请问我的程序运行出来怎么是错的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)