A. 二分查找
#include <stdio.h>
int BinarySearch(int * R,int n,int key) // 在长度为n的数组R中查找关键字key
{
int low=0,high=n-1,mid;
while(low<=high)
{
mid=(low+high)/2;
if(key<R[mid])
{
printf("R[mid]=%d <\n",R[mid]);
high=mid-1;
}
else if(key>R[mid])
{
printf("R[mid]=%d >\n",R[mid]);
low=mid+1;
}
else
{
printf("R[mid]=%d =\n",R[mid]);
return mid; // 返回查找到的索引值
}
}
return -1;
}
void main()
{
int R[]={1,2,3,5,7,8,10,15,16,17,19,20};
printf("%d\n",BinarySearch(R,12,17)); // 测试在数组R中查找17,并输出索引号
}
B. 二分查找法
总共13个,从0开始,最大是12,使用二分法原则分析如下
第一次:12/2=6 , (6)=45<90
第二次:(7+12)/2=9,(9)=77<90
第三次:(10+12)/2=11,(11)=95>90
第四次:((11-1)+10)/2=10,(10)=90 查找成功
C. C#二分查找算法
二分查找的基本思想是:(设R[low..high]是当前的查找区间)
(1)首先确定该区间的中点位置:mid=(low+high)/2
(2)然后将待查的K值与R[mid].key比较:若相等,则查找成功并返回此位置,否则须确定新的查找区间,继续二分查找
// Source:
public int search(int[] q)
{
int i, low = 0, high = q.Length - 1, middle;
Console.Write("请输入想要查找的数字:");
i=int.Parse(Console.ReadLine());
while (low <= high)
{
middle = (low + high) / 2;
if (i == q[middle])return i;
if (i < q[middle])high = middle - 1;
else low = middle + 1;
}
throw new Exception("数组中不存在这个数。");
}
D. C语言 二分查找算法 用递归实现 我改动了一下
本人直接打出来的,并未在平台上编译运行过,所以可能会有语法错位,还请自行调试更改
#include<stdio.h>
int RecorBinarySearch(int a[], int, int, int);
int main(void)
{
int i=0, n, m, key;
int a[10000], c[10000];
scanf("%d", &n);
scanf("%d", &m);
printf("提示:输入%d个整数且必须按升序排列。\n", n);
for(i=0; i<n; i++){
scanf("%d", &a[i]);
}
printf("提示:输入%d个预查找的数。\n", m);
for(i=0; i<m; i++){
scanf("%d", &key);
c[i] = RecorBinarySearch(a, key, 0, n-1);
}
printf("提示:输出预查找的数在数组中的位置。(-1代表未找到)\n");
for(i=0; i<m; i++) {
printf("%d ", c[i]);
}
return 0;
}
int RecorBinarySearch(int a[], int key, int low, int high)
{
int nRet;
if(low > high)
nRet = -1;
else {
int mid = (high + low) / 2;
if(key == a[mid])
nRet = mid;
else if(key > a[mid])
nRet = RecorBinarySearch(a, key, mid+1, high);
else if(key < a[mid])
nRet = RecorBinarySearch(a, key, low, mid-1);
}
return nRet;
}
E. 二分查找的算法复杂度
二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x.
时间复杂度无非就是while循环的次数!
总共有n个元素,
渐渐跟下去就是n,n/2,n/4,....n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数
由于你n/2^k取整后>=1
即令n/2^k=1
可得k=log2n,(是以2为底,n的对数)
所以时间复杂度可以表示O()=O(logn)
下面提供一段二分查找实现的伪代码:
BinarySearch(max,min,des)
mid-<(max+min)/2
while(min<=max)
mid=(min+max)/2
if mid=des then
return mid
elseif mid >des then
max=mid-1
else
min=mid+1
return max
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。
F. 用二分查找算法查询某学生成绩
/*这是我自己写的二分查找算法,用递归实现:在已按非降序排序的数组arr[0..length-1]中从位置startPos到endPos查找num这个值,返回值为下标的值,若没找到则返回-1。*/
int binarySearch(int *arr,int num,int startPos,int endPos)
{
if((startPos >= endPos) && (*(arr+startPos) != num))
{
return -1;
}
else
{
int j = (startPos+endPos)/2;
if(*(arr+j) == num)
{
return j;
}
else
{
if(*(arr+j) > num)
{
return binarySearch(arr,num,startPos,j-1);
}
else
{
return binarySearch(arr,num,j+1,endPos);
}
}
}
}
G. 如果数据分布不均匀,怎么优化二分查找算法
楼主是不是想求出一个最小半径的圆,圆内包含所有的点?这个问题很有趣。
寻找这个圆的时候注意一下几点:
1.这个圆必然穿过图中某些靠外围的点,这样才是最小半径的圆。
2.几何中我们知道,三个点可以确定一个圆, 我们就是需要找出这三个点来.
算法如下:1.先求这些点对应的凸包,已经有现成的算法。
2.生成凸包后,在看凸包上哪三点确定的圆可以包含凸包。
当然如果楼主讨论的不是以上所述,而是模式分类的话,建议看看数据分类方法。可以搜索关键字:Gaussian mixtrual model, expectation-maximization algorithm 和 k-mean algorithm 学习下相关的知识。
H. 二分查找算法
前提要求数据排好序,有递归和非递归版本
int binSearch(const int *Array,int start,int end,int key)
{
int left,right;
int mid;
left=start;
right=end;
while (left<=right) { /注释中为递归算法,执行效率低,不推荐
mid=(left+right)/2;
/* if (key<Array[mid]) {
return(binSearch(Array,left,mid,key));
}
else if(key>Array[mid]){
return (binSearch(Array,mid+1,right,key));
}
else
return mid;
*/
if (key<Array[mid]) {
right=mid-1;
}
else if(key>Array[mid]){
left=mid+1;
}
else
return mid;
}
return -1;
}
I. 对比顺序查找,二分查找和哈希查找算法,它们各自的特点是什么
顺序查找,二分查找和哈希查找算法,它们各自的特点是:
1.对比顺序查找的特点就是从表的第一个元素开始一个一个向下查找,如果有和目标一致的元素,查找成功;如果到最后一个元素仍没有目标元素,则查找失败。
2.二分查找的特点就是从表中间开始查找目标元素。如果找到一致元素,则查找成功。如果中间元素比目标元素小,则仍用二分查找方法查找表的后半部分(表是递增排列的),反之中间元素比目标元素大,则查找表的前半部分。
3.哈希算法的特点是是使用给定数据构造哈希表,然后在哈希表上进行查找的一种算法。先给定一个值,然后根据哈希函数求得哈希地址,再根据哈希地址查找到要找的元素。是通过数据元素的存储地址进行查找的一种算法。