二分法:二分法查找适用于数据量较大时,但是数据需要先排好顺序。主要思想是:(设查找的数组区间为array[low, high])
(1)确定该区间的中间位置K
(2)将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。区域确定如下:a.array[k]>T 由数组的有序性可知array[k,k+1,……,high]>T;故新的区间为array[low,……,K-1]b.array[k]<T 类似上面查找区间为array[k+1,……,high]。每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间将缩小一半,递归查找即可。(百度百科)
二分法搜索前提数据必须是有序数组,所以第一步对给定数堆进行排序:
void small_to_max(int a[],int length) //此函数功能讲数据由小到大排序,之前文章有解释过 { int i; int max=0; while(length != 1){ for(i=0; i<length-1; i++){ if(a[i] > a[i+1]){ max=a[i]; a[i]=a[i+1]; a[i+1]=max; } } length--; } }
由第一步已经得到一组有序数堆,然后就可以用二分法进行搜索:
int search(int a[],int length,int key) { int result=-1; int left,right; left=0; right=length; //left数组最左值,right数组最右值 while( right > left ){ int middle=(right+left)/2; if(key == a[middle] ) { result = middle; break; } else if ( key < a[middle] ) { right = middle-1; } else { left = middle+1; } } return result; }
给定一组无序数堆,用户输入一个整数,使用二分法查找该数是否在此数堆中。
整体代码如下:
#include<stdio.h> #include<stdlib.h> #include<time.h> void small_to_max(int a[],int length); int search(int a[],int length,int key); int main() { const int size=100; int a[size]={0}; srand(time(NULL)); //rand函数生成随机数 int i; for(i=0; i<size; i++){ a[i]=rand()%100; //为了测试方便,随机给定100个100以内的数 } int key=0; printf("请输入你要查找的数:"); scanf("%d",&key); //调用small_to_max函数排序 small_to_max(a,sizeof(a)/sizeof(a[0])); printf("该数堆元素为:\n"); for(i=0; i<size; i++){ printf("%d\t ",a[i]); if( i % 10 == 0){ printf("\n"); } } printf("\n"); //调用search函数查找输出结果 int result=search(a,sizeof(a)/sizeof(a[0]),key); if(result != -1){ printf("%d该数在数堆第%d个位置上\n",key,result); }else{ printf("该数%d不在此数堆中\n",key); } return 0; } void small_to_max(int a[],int length) //将给定数据由小到大排序 { int i; int max=0; while(length != 1){ for(i=0; i<length-1; i++){ if(a[i] > a[i+1]){ max=a[i]; a[i]=a[i+1]; a[i+1]=max; } } length--; } } int search(int a[],int length,int key) //二分法查找 { int result=-1; int left,right; left=0; right=length; while( right > left ){ int middle=(right+left)/2; if(key == a[middle] ) { result = middle; break; } else if ( key < a[middle] ) { right = middle-1; } else { left = middle+1; } } return result; }
C语言:二分法搜索
于 2022-04-08 16:12:32 首次发布