查找

静态查找 :不涉及插入和删除操作的查找 。

动态查找 :涉及插入和删除操作的查找。

构建查找的代码实现


using namespace std;

const int MaxSize = 100;

class LineSearch{

public:

   
LineSearch(int a[ ], int n); //构造函数

  
~LineSearch( ) { } //析构函数为空

   
int SeqSearch(int k); //顺序查找

   
int BinSearch1(int k); //折半非递归查找

   
int BinSearch2(int low, int high, int k); //折半递归查找

private:

   
int data[MaxSize]; //查找集合为整型

   
int length; //查找集合的元素个数

};

构造函数

LineSearch :: LineSearch(int a[ ], intn){   
for (int i = 0; i < n; i++)
data[i+1] = a[i]; //查找集合从下标1开始存放   
length = n;
}

没有设置哨兵的查找需要检查数组有没有溢出

int LineSearch :: SeqSearch(int k)

{      
i=n;
//需要检查是否有数组溢出
while (i>0 && data[i]!=k)        
i--;    
return i;
}

设置哨兵的查找不用检验溢出

int LineSearch :: SeqSearch(int k)

   
int i = length;        //从数组高端开始比较

   
data[0] = k;           //设置哨兵

   
while (data[i] != k) //不用判断下标i是否越界

       
i--;

   
return i; 

}


链表的查找

int LinkSearch::SeqSearch2(Node *first,
int k){  

       Node
*p;

       int
count=0;//记录比较的次数

       p=first->next;


       int
j=1;//记录数据在表中的位置

     
while (p &&  p->data !=
k)

       {p=p->next; j++;   
count++;}

       if
(!p){

             cout<<“查找失败,比较的次数为:"<<count<<endl;        

             return 0;

    
} else{

           cout<<“\n”<<“查找成功,比较的次数为:"<<count<<endl;      

         
return j;

       }

}


折半查找非递归操作

int LineSearch :: BinSearch1(int k){

    
int mid, low = 1, high = length; //初始查找区间是[1, n]

    
while (low <= high) {//当区间存在时

         
mid = (low + high) / 2; 

         
if (k < data[mid]) 

              high = mid - 1;

         
else if (k > data[mid]) 

               low = mid + 1; 

         
else

               return mid; //查找成功,返回元素序号

     
}

     
return 0; //查找失败,返回0

}


折半查找递归操作

int LineSearch :: BinSearch2(int low,
int high, int k){

     
if (low > high) 

         
return 0; //递归的边界条件

     
else {

        
int mid = (low + high) / 2;

     
if (k < data[mid]) 

           return BinSearch2(low, mid-1, k);

     
else if (k > data[mid]) 

           return BinSearch2(mid+1, high, k); 

     
else 

           return mid; //查找成功,返回序号

    
}

}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值