原理:
首先,二分查找针对的是已经排好序的数组,如果给出的数组是无序的,则需要先将数组进行排序。
每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为 0。
如果查找值比中间位置的元素小,则从数组的左边继续查找,如果查找值比中间位置的元素大,则从数组的右边继续查找。
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
#include "stdio.h"
int search (int *p , int length , int n);
int main()
{
//二分查找,一定是在已经排好序的数组中进行查找
int a[] = {1,2,5,8,23,56,89,123} ;
int *p = a ;
int length = sizeof(a)/sizeof(int) ;
int n , t ;
printf(" 请输入你要查找的数:") ;
scanf("%d",&n) ;
t=search(p , length , n) ;
if( t == -1 ){
printf("没查找到该数!!!\n");
}else
printf("%d的下标为:%d\n",n,t);
}
int search (int *p , int length , int n){
int temp , low , high ;
low = 0;
high = length - 1 ;
while (low <= high) {
temp = (low + high)/2 ;
if(p[temp] == n) //查找到所需查找的数
return temp ;
else if(p[temp] < n)
low = temp + 1 ;
else
high = temp - 1 ;
}
return -1 ; //查找不到
}