顺序查找与二分查找
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)为数组最多可以拆分的次数,也即为到达数组一端的需要的步数。
不过二分查找的前提是数组有序,而顺序查找则不用
#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)为数组最多可以拆分的次数,也即为到达数组一端的需要的步数。
不过二分查找的前提是数组有序,而顺序查找则不用
相关文章推荐
- 30分钟带你快速入门MySQL教程
- 【bzoj1052】[HAOI2007]覆盖问题
- how browser works
- IP组播技术介绍及实现例子
- 黑马程序员——File类及Properties类
- [kuangbin带你飞]专题一 简单搜索 总结
- 第一个Sprint冲刺第四天
- 个人阅读作业Week7
- (转载)深入PendingIntent
- Android 多线程断点下载project总结
- Java再学习——synchronized与volatile
- Step by Step Learn Python(1)
- 用gdb来调试除数为0而产生的core
- Python正则表达式指南
- 索引列的选择
- [阅读]个人阅读作业week7
- javax.net.ssl.SSLException: hostname in certificate didn't match:
- week7 read
- SQL分页查询
- Mac OS下应用Python+Selenium实现web自动化测试