顺序表查找算法

顺序表的插入和删除算法的时间复杂度为O(n);

求顺序表表长以及取顺序表第i个元素的值这两个算法的时间复杂度为O(1)

查找算法LocateElem_Sq的时间复杂度为O(L.length)

 

查找算法的实现:

int LocateElem(SqList &L,ElemType elem,status(*compare)(ElemType&,ElemType &))

{

      for(int index=1;index<=L.length;++index){

            if(compare(elem,L.elem[index-1]))

                  return index;

      }

      return 0;

}

int LocateElem(SqList &L,ElemType elem,Status(*compare)(ElemType&,ElemType&))

{

      int index=1;

      ElemType *p=L.elem;

      while(index<=L.length&&!(compare(elem,*p++)))

            ++index;

      if(index<=L.length)

            return index;

      return 0;

}

 

顺序表的合并操作://过多代码冗余(顺序表的缺点在于长度固定,添加元素要考虑是否溢出的情况)

void MergeList(SqList &La,SqList &Lb,SqList &Lc)

{

      InitList(Lc);

      int i=j=k=1;

      for(i<=La.length&&j<=Lb.length){

            if(La.elem[i]<=Lb.elem[j]){

                  Lc.elem[k++]=La.elem[i++];

                  ++Lc.length;

            }

            else{

                  Lc.elem[k++]=Lb.elem[j++];

                  ++Lc.length;

            }

            if(Lc.length>=Lc.listsize){

                  ElemType *newbase=(ElemType*)realloc(Lc.elem,(LISTINCREMENT+Lc.listsize)*sizeof(ElemType));

                  if(!newbase)

                        exit(OVERFLOW);

                  L.elem=newbase;

                  L.listsize+=LISTINCREMENT;

            }

      }

      while(i<=La.length){

            Lc.elem[k++]=La.elem[i++];

            ++Lc.length;

            if(Lc.length>=Lc.listsize){

                  ElemType *newbase=(ElemType*)realloc(Lc.elem,(LISTINCREMENT+Lc.listsize)*sizeof(ElemType));

                  if(!newbase)

                        exit(OVERFLOW);

                  L.elem=newbase;

                  L.listsize+=LISTINCREMENT;

            }

     }

    

      while(j<=Lb.length){

            Lc.elem[k++]=La.elem[j++];

            ++Lc.length;

            if(Lc.length>=Lc.listsize){

                  ElemType *newbase=(ElemType*)realloc(Lc.elem,(LISTINCREMENT+Lc.listsize)*sizeof(ElemType));

                  if(!newbase)

                        exit(OVERFLOW);

                  L.elem=newbase;

                  L.listsize+=LISTINCREMENT;

            }

     }

}

 

//改进:一次性分配“足够大”的空间给新顺序表

void MergeList_Sq(SqList &La,SqList &Lb,SqList Lc)

{

      Lc.elem=(ElemType*)malloc((La.length+Lb.length)*sizeof(ElemType));

      if(!Lc.elem)

            exit(OVERFLOW);

      Lc.listsize=La.length+Lb.length;

      int i=j=k=1;

      for(i<=La.length&&Lb.length){

            if(La.elem[i]<=Lb.elem[i]){

                  Lc.elem[k++]=La.elem[i++];

                  ++Lc.length;     

            }

            else{

                  Lc.elem[k++]=Lb.elem[j++];

                  ++Lc.length;

            }

      }

      while(i<=La.length){

            Lc.elem[k++]=La.elem[i++];

            ++Lc.length;

      } 

      while(j<=Lb.length){

            Lc.elem[k++]=Lb.elem[j++];

            ++Lc.length;

     }

}

//使用线性表来表示集合,在其上面的做集合运算要先对线性表进行排序

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值