【C语言】折半查找。

首先,
一:你要查找的表是有规定的有序表
有序表:表中数据元素按关键码升序或降序排列的表称为有序表。
二:折半查找的思路是:
(1)在有序表中取中间元素作为比较对象,
(2)若给定值与中间元素的关键码相等,则查找成功;
(3)若给定值小于中间元素的关键码,则在中间元素的左半区继续查找;
同理,如果找不到在右半部查找。
(4)不断重复上述的查找过程,直到查找成功,或所查找的区域无数据元素,查找失败。

跟着我的思维,让我们进入下面程序:

#include <stdio.h>
int binsearch(int x,int arr[],int n)
{
    int left = 0;
    int right = n-1;
    while(left < right)
    {
        int mid = (left+right)/2;
        if(x < arr[mid])
        {
            right = mid-1;
        }
        else if(x == arr[mid]) 
        {
            return mid;
        }
        else
        {
            left = mid+1;
        }
    }
    return -1;
}

int main ()
{
    int a[]={1,2,3,4,5,6,7,8};
    int ret = binsearch(8,a,sizeof(a)/sizeof(a[0]));
    printf("%d\n",a[ret]);
    return 0;
}

程序的目的是想要查找数组中的数字8,让我们看看运行结果是否如意?
如果你是计算机,你会怎么计算?

是不是发现在查找最大那位数的时候没有结果?你不妨试试在纸上写一个简单的序列并且跟着上面程序的步骤仔细地进行一次下标的追踪,如果你足够细心,那么你就会发现在binsearch函数中当两个下标相等的时候,程序已经退出while循环,直接返回-1了,试想一下如果在while循环里添加一个等号,当两下标相等时能再一次进入循环,此时无论left还是right还是mid,都指向同一个数了,这时是不是就能返回那个最大的数了。

好了!我们看看正确的程序吧!

#include <stdio.h>
int binsearch(int x,int arr[],int n)
{
    int left = 0;
    int right = n-1;
    while(left <= right)
    {
        int mid = (left+right)/2;
        if(x < arr[mid])
        {
            right = mid-1;
        }
        else if(x == arr[mid]) 
        {
            return mid;
        }
        else
        {
            left = mid+1;
        }
    }
    return -1;
}

int main ()
{
    int a[]={1,2,3,4,5,6,7,8};
    int ret = binsearch(8,a,sizeof(a)/sizeof(a[0]));
    printf("%d\n",a[ret]);
    return 0;
}

两个程序仅仅相差一个等号!计算机只会跟着你编的程序走,所以你编 什么样的程序它就走什么样的程序。

不知你有木有注意到程序中使用了单目操作符sizeof,sizeof操作符判断它的操作数的类型长度,以字节为单位表示。

你可能感兴趣的:(【C语言】折半查找。)