静态查找方法(顺序查找与二分查找)

来源:互联网 发布:javascript和node.js 编辑:程序博客网 时间:2024/05/21 21:55
/*静态查找的几种方法*/#include <stdio.h>#define MaxSize 20typedef struct LNode *List;struct LNode{    ElementType Data[MaxSize];    int length;}; /*顺序查找(Sequential Search),采用了建立哨兵的查找思想,最好查找复杂度O(1),最坏为O(n),平均查找复杂度为O(n/2)*/int SequentialSearch(List Tb1,ElementType K){    /*在ElementType[1]~ElementType[n]中查找关键字为K的数据元素*/    int i;    Tb1->Data[0]=K; /*建立哨兵*/     for(i=Tb1->length;Tb1->Data[i]!=K;i--);    return i; /*查找成功返回元素所在单元的下标;不成功则返回0*/ }  /*二分查找Binary Search,时间复杂度为O(logN)*/ /*前提n个数据元素的关键字满足有序(排序至少要花费O(nlogn)的时间),并且是连续存放(数组)*/ /*   二分查找判定树:     判定树上的每个结点需要查找的次数刚好等于该结点所在的层数;     查找成功时查找次数不会超过判定树的深度     n个结点的判定树的深度为[log2n]+1      平均成功查找次数ASL=(每层结点数*层数之和)/总的结点数 =log2(n+1)-1     二分查找最坏情况和平均情况相当接近     二分查找插入删除都必须移动大量的结点,二分查找适合那种一经建立就很少改动,而又经常需要查找的线性表      对于那些查找少而又经常需要改动的线性表,可以采用链表作为存储结构,经行顺序查找,链表无法实现二分查找 */ /*假设有13个数据元素,按照关键字由小到大顺序存放,二分查找关键字为444的数据元素过程*/ int BinarySearch(List Tbl,ElementType K){   /*在表Tbl中查找关键字为K的数据元素*/     int left,right,NotFound=-1;     left=1;  //初始左边界     right=Tbl->length;  //初始有边界     while(left<=right)    {        mid=*(left+right)/2; //计算中间元素坐标         if(K<Tbl->Data[mid]) right=mid-1; //调整右边界         else if(K>Tbl->Data[mid]) left=mid+1; //调整左边界         else return mid;  //查找成功,返回数据元素下标     }    return NotFound  //查找不成功,返回-1  }