【原创】用迭代方式实现二分查找
//生成N个介于0~(M-1)之间的 不重复的整数,按升序排列,用二分查找找到某个数字的位置并输出查找次数
#include <iostream>
#include <ctime>
#include <queue>
#define M 10000
#define N 5000 //N必须小于等于M
int Count;
using namespace std;
int findNum(int* n,int fn);
int main()
{
srand((unsigned)time(0));
int a[M];
int n[N];
int k=0;
priority_queue<int,deque<int>,greater<int> > pq; //升序排列
for(int i=0;i<M;i++) //生成0~(M-1)之间的整数,按从小到大升序排列
a[i]=i;
for(int i=0;i<N;i++)
{ //从a[0]~a[M-i]间随机取一个a[k]赋给n[i]
k=rand()%(M-i); //并将a[k]和a[M-1-i]交换
n[i]=a[k];
a[k]=a[M-1-i];
pq.push(n[i]); //将数组n的元素压入优先级队列pq
}
for(int i=0;i<N;i++)
{
cout <<pq.top() <<" ";
n[i]=pq.top(); //将排序后的值赋给数组n
pq.pop();
}
cout <<endl <<"请输入您要查找的数字:" ;
int fnum=0,f=0;
cin >>fnum;
f=findNum(n,fnum)+1;
cout <<"查找了" <<Count <<"次" <<endl;
if(f)
cout <<fnum <<"在第" << f <<"个位置";
else
cout <<"找不到" <<fnum;
cout <<endl;
system("pause");
return 0;
}
//二分查找
int findNum(int* n,int fn)
{
int mid=0,
b=0,
e=N;
while(true)
{
mid=(b+e)/2;
Count++;
if(n[mid]<fn)
{
if(mid==e) return -1;
b=mid+1;
continue;
}
else if(n[mid]>fn)
{
if(mid==b) return -1;
e=mid-1;
continue;
}
else //n[mid]==fn
break;
}
return mid;
}