順序查找

    1. 順序查找又称为线性查找,类似于遍历操作,对于数组就是依靠数组下标,对于链表依靠next指针。<br />一般线性表的顺序查找<br />引入哨兵( 不必判断数组是否越界),并非该算法独有,避免很多不必要的判断,提高效率。
    1. typedef struct {
    2. ElemType *elem; // 数组的动态分配,0号单元留空,申请长度时len+1(1留空)
    3. int TableLen;
    4. }SSTable; // 定义查找表
    5. // 顺序查找不会改变查找表,无须传入指针
    6. int Search_Seq(SSTable ST,ElemType key)
    7. {
    8. ST.elem[0] = key;
    9. for (i = ST.TableLen;ST.elem[i] != key;i--)// 逆序与哨兵比较
    10. return i;
    11. }
    12. // 返回0说明查找失败

    下标说明:由于0号单元留空,所以申请n+1个元素,n为上述代码中的TableLen

    1. SSTable T;
    2. int TableLen = 8;
    3. T.elem = (ELemType *)malloc(sizeof(Elemtype)*(TableLen+1))

    时间复杂度与分析 :
    逆序查找时,第n位,比较1次。即第i各元素,(n+1-i)次比较,等概率进行累加
    查找成功:ASL(平均查找长度)= (n+1)/2
    查找失败:查找次数等于申请的空间数,为(n+1),ASL(不成功的平均查找长度) = n+1

    通常,查找表中的概率并不相等(很多数据重复),应该先按概率大小重新排序。
    优点:数据的存储方式没有要求,表的有序性没有要求,无论关键字有序。
    缺点:n大时,ASL大,低效。