顺序查找与折半查找的性能比较及C++ 计时函数的介绍

顺序查找和折半查找都是很常用的查找算法,他们的查找对象都是顺序表。

顺序查找就是按照顺序表,一个一个问哎是不是你是不是你,不是就继续问下一个直到找到为止,简单有效的方法。时间复杂度为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;

然后分别在需要计时部分前后加上两个函数。

start=clock();   end=clock();

最后再用一个函数就可以计算出来最终的运行时间:

double Cost_time = (double)(finish-start)/CLOCKS_PER_SEC;

这个函数大概实现过程就是,定义两个点,分别在计时部分开始前和开始后获取一个时间点,但是这个时间不是我们通常意义上的时间,而是一种类似于运行次数之类的,然后除以CPU有关的数,得出来的就是时间。是不是s不太确定,但是可以反映程序运行的快慢了~
  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值