二分查找递归非递归算法对比

#include <iostream>

#include <ctime>//时间函数

#include <windows.h>系统函数

#include <fstream>

#include <cstdlib>

#include <iomanip>//声明流操作符的头文件

using namespace std;

/*************非递归二分搜索****************/

class Solution

{

       public:

       intbinarySearch(const int A[], int X, int N)//二分查找函数

       {

              intstart = 0, end = 0, mid;

              end= N;

              while(start <= end)

              {

                     mid= start + (end-start)/2;

                     if(X > A[mid])

                     {

                            start= mid+1;

                            continue;

                     }

     else if (X < A[mid])

                     {

                            end= mid-1;

                            continue;

                      }

     else

              {

                            returnmid;

              }

       }

                     return-1;

    }

};

 

/**********递归二分搜索****************/

int BinSearch(int Array[], int low, inthigh, int key)

{

       if(low <= high)

       {

              intmid = (low + high) / 2;

              if(key == Array[mid])

                     returnmid;

              elseif (key<Array[mid])

                     returnBinSearch(Array, low, mid - 1, key);//进行递归

              elseif (key>Array[mid])

                     returnBinSearch(Array, mid + 1, high, key);

       }

       else

              return-1;

}

 

 

 

int main(int argc, const char * argv[])//

{

       intret;

       intneed[10000];

 

       for(inti=0;i<10000;i++)//110000存进数组

       {

              need[i]=i;

       }

 

 

       clock_tstart1,finish1;

       longdouble totaltime1;

       start1=clock();

       intsz=sizeof(need)/sizeof(need[0])-1;//sz的长度

      

       finish1=clock();//结束时间

      

 

 

 

 

       inttarget=0;

       cout<<"请输入查找数字:"<<endl;

       cin>>target;

 

 

       clock_tstart2,finish2;

       longdouble totaltime2;

       start2=clock();

       for(inti=0;i<100000000;i++)//让函数执行这么多次算总时间

       {

              Solutionc;

              ret=c.binarySearch(need,target,sz);

      

       }

       finish2=clock();

       totaltime2=(double)(finish2-start2)/CLOCKS_PER_SEC;

       cout<<"\n非递归二分搜索查找时间为:"<<totaltime2<<"秒!"<<endl;

 

 

       clock_tstart3,finish3;

       longdouble totaltime3;

      

start3=clock();

       for(int i = 0; i < 100000000; i++)

              {

                     intsit = BinSearch(need, 0, sz, target);

              }

 

       finish3=clock();

       totaltime3=(double)(finish3-start3)/CLOCKS_PER_SEC;

       cout<<"\n递归二分搜索查找时间为:"<<totaltime3<<"秒!"<<endl;

 

 

       cout<<"目标数:"<<target<<endl;

       if(ret==-1)

       cout<<"找不到"<<endl;

       else

       cout<<"找到了,坐标为:"<<ret<<endl;

       system("pause");

       return0;

}

 

运行结果:

 

结果分析:

这次的算法虽然没有在大量的数字中进行查找,但是让这个查找函数循环了非常多次,来计算总时间,将两个算法搜索时间放大化,这样也可以对比出算法的优劣,由结果得,递归的时间是要小于朴素算法的时间的下面比较它们在其他方面的不同:

递归结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性,而且写起来简单递归相比非递归的区别是递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多另一个是调用接口的开销,函数调用本身是有开销的。还有是堆栈内存比较小递归调用层次深,复杂时可以采用递归,但是容易引起堆栈溢出错误。非递归没有这个问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值