数据结构------顺序查找

1.查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录)。

  查找算法分类:

  1)静态查找和动态查找;

    注:静态或者动态都是针对查找表而言的。动态表指查找表中有删除和插入操作的表。

  2)无序查找和有序查找。

    无序查找:被查找数列有序无序均可;

    有序查找:被查找数列必须为有序数列。

2.平均查找长度(Average Search Length,ASL):需和指定key进行比较的关键字的个数的期望值,称为查找算法在查找成功时的平均查找长度。

  对于含有n个数据元素的查找表,查找成功的平均查找长度为:ASL = Pi*Ci的和。
  Pi:查找表中第i个数据元素的概率。
  Ci:找到第i个数据元素时已经比较过的次数。

二.查找算法:

1.顺序查找:

int SequenceSearch(int a[],int value,int n)
{
    int i;
    for(i=0;i<n;i++)
        if(a[i]=value)
            return i;
    return -1;
}
//添加哨兵
//避免了每次i与n的比较
int SequenceSearch(int a[],int value,int n)
{
    int i;
    a[n]=value;//哨兵
    i=0;
    while(a[i]!=value)
    {
        i++;
    }
    return i;//返回n查找失败
}

复杂度:

2.二分法查找:

int BinarySearch(int a[],int value,int n)
{
    int low,high,mid;
    low=0;
    high=n-1;
    while(low<=high)
    {
        mid=(low+high)/2;
        if(a[mid]==value)
            return mid;
        if(a[mid]>value)
            high = mid-1;
        if(a[mid]<value)
            low = mid+1;
    }
    return -1;
}

递归版本:

int BinarySearch2(int a[], int value, int low, int high)
{
    int mid = low+(high-low)/2;
    if(a[mid]==value)
        return mid;
    if(a[mid]>value)
        return BinarySearch2(a, value, low, mid-1);
    if(a[mid]<value)
        return BinarySearch2(a, value, mid+1, high);
}

3.插值查找:

int BinarySearch2(int a[], int value, int low, int high)
{
    int mid = low+(high-low)*(value-a[low])/(a[high]-a[low]);
    if(a[mid]==value)
        return mid;
    if(a[mid]>value)
        return BinarySearch2(a, value, low, mid-1);
    if(a[mid]<value)
        return BinarySearch2(a, value, mid+1, high);
}

4.菲波那切查找:

int Fibonacci_Search(int a[],int n,int value)
{
    int low,high,mid,i,k;
    low=1;          //最下标为记录首位
    high=n;         //最高下标为记录首位
    k=0;
    while(n>F[k]-1)        //计算n位于斐波那契的位置
        k++;
    for(i=n;i<F[k]-1;i++)    //将不满的数值补全
        a[i]=a[n];
    while(low<high)
    {
        mid=low+F[k-1]-1;
        if(value<a[mid])
        {
            high=mid-1;
            k=k-1;
        }
        else if(value>a[mid])
        {
            low=mid+1;
            k=k-2;
        }
        else
        {
            if(mid<=n)
                return mid;   //查找到位置
            else
                return n;        //补全数值返回n
        }
    }
    return 0;
}

参考资料:

《大话数据结构》

猜你喜欢

转载自blog.csdn.net/qq_39503189/article/details/81742581