查找算法之折半查找

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;
}

你可能感兴趣的:(查找算法之折半查找)