先上代码:
#include <iostream>
void printArr(int *a,int n);
void bubleSort(int *a,int n);
void swap(int *a,int*b);
int binarySearch(int* a, int n, int k);
int normalSearch(int*a, int n, int k);
using namespace std;
int main()
{
while(1)
{
int n,k;
cout<<"input array size:"<<endl;
cin>>n;
int *a=new int[n];
for (int i=0;i<n;i++)
{
a[i]=rand();
}
cout<<"init random arr:"<<endl;
printArr(a,n);
bubleSort(a,n);
cout<<"after sort:"<<endl;
printArr(a,n);
cout<<"input k value:"<<endl;
cin>>k;
cout<<"normal search:"<<endl;
cout<<normalSearch(a,n,k)<<endl;
cout<<"binary search:"<<endl;
cout<<binarySearch(a,n,k)<<endl;
delete[]a;
}
return 0;
}
void printArr(int *a,int n)
{
for (int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
int normalSearch(int*a, int n, int k)
{
for (int i=0;i<n;i++)
{
if(*(a+i)==k)
{
return i;
}
}
return -1;
}
int binarySearch(int* a, int n, int k)
{
int lower=0;
int upper=n-1;
while (1)
{
int cur=(lower+upper)/2;
if (a[cur]==k)
{
return cur;
}
if (lower==upper)
{
return -1;
}
if (k>a[cur])
{
lower=cur+1;
}
else
{
upper=cur-1;
}
}
return 0;
}
void bubleSort(int *a,int n)
{
int *outer=a+n-1;
for (;outer!=a;outer--)
{
for (int*inner=a;inner!=outer;inner++)
{
if (*inner>*(inner+1))
{
swap(inner,inner+1);
}
}
}
}
void swap(int *a,int*b)
{
int temp=*a;
*a=*b;
*b=temp;
}
顺序查找的效率为 (1+2+3+...+n)/n = (1+n)/2 ==== O(n)
二分法查找的效率为 1+2+...+log2(n) = (1+log2(n))==== O(log2(n))
log2(n)为数组最多可以拆分的次数,也即为到达数组一端的需要的步数。
不过二分查找的前提是数组有序,而顺序查找则不用