二分查找:
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
算法要求:
1.必须采用顺序存储结构。
2.必须按关键字大小有序排列。
代码如下:
#include<stdio.h>
#define DATASIZE 6
int BinSearch(int arr[],int keyval)
{
int left = 0;
int right = DATASIZE;
int middle;
while(left <= right)//当左边大于右边则跳出循环
{
//更新中间值
middle = (left + right)/2;
//找到就返回元素的下标
if(arr[middle] == keyval) return middle;
//若中间值比目标元素大,则要从中间值左边找
else if(arr[middle] > keyval) right = middle -1;
//若中间值比目标元素小,则要从中间值右边找
else left = middle + 1;
}
return -1;
}
int main()
{
int arr[DATASIZE] = {1,6,9,16,65,99};
int rec;
int keyval = 99;
rec = BinSearch(arr,keyval);
if(rec == -1) printf("%-2d不是该序列中的元素!\n",keyval);
else printf("你找到了%d ,第 %d 个元素就是你想要的!\n",keyval,rec+1);
return 0;
}