您的位置:首页 > 其它

顺序查找与二分查找

2015-11-14 23:51 351 查看
先上代码:

#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
;
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)为数组最多可以拆分的次数,也即为到达数组一端的需要的步数。

不过二分查找的前提是数组有序,而顺序查找则不用 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: