Binary Search
折半查找又称二分查找,要求数据序列呈线性结构,即先排序,在查找。可以明显的提高查找速度,其流程如下:
默认数组为a[];需查找的值为x;
首先设置3个变量low、mid、high,分别保存数组元素开始、中间和末尾元素的序号。接着进行以下判断。
1:如果数组中序号为mid的值与需查找的值相等,则表明已经找到了数据,返回该序列号mid;
2:如果需查找的值x<a[mid];则舍弃mid至high之间的数据,继续查找low之mid-1之间的数据;
3:如果需查找的值x>a[mid];则舍弃low至mid之间的数据,继续查找mid+1至high之间的数据;
4:逐步循环,如果到low>hing时仍未找到数据x,则表示数组中无此数据;
#include<stdio.h> #include<stdlib.h> #include<time.h> #define SIZE 10 void quicksort(int *a,int l,int r) { int temp; int i=l,j=r; if(l<r) { temp=a[l]; while(i!=j) { while(j>i&&a[j]>temp) --j; if(i<j) { a[i]=a[j]; ++i; } while(i<j&&a[i]<temp) ++i; if(i<j) { a[j]=a[i]; --j; } } a[i]=temp; quicksort(a,l,i-1); quicksort(a,i+1,r); } } int searchfun(int a[],int n,int x) { int mid,low,high; low=0; high=n-1; while(low<=high) { mid=(low+high)/2; if(a[mid]==x) return mid; if(a[mid]>x) high=mid-1; else low=mid+1; } return -1; } int main() { int x,n,i; int shuzu[SIZE]; srand(time(NULL)); for(i=0;i<SIZE;i++) shuzu[i]=rand()/1000+100; printf("排序前的数组为:\n"); for(i=0;i<SIZE;i++) printf("%d ",shuzu[i]); printf("\n"); quicksort(shuzu,0,SIZE-1); printf("排序后的数组为:\n"); for(i=0;i<SIZE;i++) printf("%d ",shuzu[i]); printf("\n"); printf("输入要查找的数:"); scanf("%d",&x); n=searchfun(shuzu,SIZE,x); if(n<0) printf("没找到数据。\n"); else printf("数据:%d位于数组的第%d个元素处。\n",x,n+1); return 0; }