2020-10-07

    科技2024-03-13  89

    二分法查找


    思路:

    [一维数组,折半查找]

    假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.

    1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为a[mid]>x,故应在前半段中查找。

    2.令新的end=mid-1=2,而front=0不变,则新的mid=1。此时x>a[mid],故确定应在后半段中查找。

    3.令新的front=mid+1=2,而end=2不变,则新的mid=2,此时a[mid]=x,查找成功。

    如果要查找的数不是数列中的数,例如x=25,当第三次判断时,x>a[mid],按以上规律,令front=mid+1,即front=3,出现front>end的情况,表示查找不成功。


    实现代码:

    /* 二分法查找 */ /***************输入一组阿拉伯数字,查找一个你指定的数值********** */ #include <stdio.h> #define NUM 7 int main() { int i = 0,j = 0; int num = NUM+1; int a[NUM] = {0}; printf("请输入%d个阿拉伯数字:",num); for(i = 0;i < (NUM+1);i++) { scanf("%d",&a[i]); } for(i = 0;i < NUM;i++) { for(j = (i+1);j <= NUM;j++) { int tem; if(a[i] > a[j]) { tem = a[i]; a[i] = a[j]; a[j] = tem; } } } printf("从小到大依次是:"); for(i = 0;i <= NUM;i++) { printf("%d ",a[i]); } putchar('\n'); printf("请输入你要查找的数值:"); scanf("%d",&i); int front,mid,end; front = 0; end = NUM; mid = (front + end)/2; while(i != a[mid]) { if(i < a[mid]) { end = mid - 1; mid = (front + end)/2; }else if(i > a[mid]) { front = mid + 1; mid = (front + end)/2; } if(front > end) { printf("要查找的数不存在!\n"); break; } } if(front <= end) { printf("要查找的数它的下标是%d\n",mid); } return 0; }

    运行结果:

     

     

     

     

     

     

     

    Processed: 0.011, SQL: 8