顺序查找和折半查找都是很常用的查找算法,他们的查找对象都是顺序表。
顺序查找就是按照顺序表,一个一个问哎是不是你是不是你,不是就继续问下一个直到找到为止,简单有效的方法。时间复杂度为O(n),平均复杂度为O(n/2),还是一个级别。
折半查找查找的前提是此顺序表必须是有序的,即需要先排序,然后再查找。他的查找方法就是定区间,折中取数如果寻找的数大于这个数那么就在右区间继续查找,如果小于这个数就在左区间继续查找。时间复杂度为log2(n),也就是说long long 范围内,最多查找60多次就能找到。。。,这和顺序查找完全不是一个级别的。。
看看测试程序和结果吧。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <ctime>
#define maxn 100000005
using namespace std;
int main(){
while(1){
long long num;
cout<<"输入查找的数据量:"<<endl;
cin>>num;
long long *s=new long long[num],i=num-1;
while(i>=0){
s[i]=i;
i--;
}
cout<<"请输入要查找的元素:"<<endl;
long long key;
cin>>key;
clock_t start1,finish1;
start1=clock();
for(int i=1;i<num;i++)
if(s[i]==key)
break;
finish1=clock();
double Cost_time1 = (double)(finish1-start1)/CLOCKS_PER_SEC;
cout<<"顺序查找所花费的时间为:"<<Cost_time1<<"s"<<endl;
clock_t start2,finish2;
start2=clock();
long long left=0,right=num-1,mid=(left+right)/2;
while(left<=right){
if(s[mid]==key)
break;
else if(s[mid]<key)
right=mid-1;
else
left=mid+1;
mid=(left+right)/2;
}
finish2=clock();
double Cost_time2 = (double)(finish2-start2)/CLOCKS_PER_SEC;
cout<<"顺序表折半查找所花费的时间为:"<<Cost_time2<<"s"<<endl;
}
return 0;
}
测试的结果为:
数据再大就要炸了~然而折半查找还是0,就那几十次根本测不出来好么。。。。。
然后说一下测试程序中用到的计时函数:
头文件: #include<ctime>
使用方法:定义两个时间点,如 clock_t start,end;
这个函数大概实现过程就是,定义两个点,分别在计时部分开始前和开始后获取一个时间点,但是这个时间不是我们通常意义上的时间,而是一种类似于运行次数之类的,然后除以CPU有关的数,得出来的就是时间。是不是s不太确定,但是可以反映程序运行的快慢了~然后分别在需要计时部分前后加上两个函数。
start=clock(); end=clock();
最后再用一个函数就可以计算出来最终的运行时间:
double Cost_time = (double)(finish-start)/CLOCKS_PER_SEC;