`
xitong
  • 浏览: 6176748 次
文章分类
社区版块
存档分类
最新评论

顺序查找和二分法查找

 
阅读更多

顺序查找和二分法查找


顺序查找:对表中的元素排序无要求,但如果表中各个元素的查找概率并不相等,则应先对元素的查找概率进行排序,使表中元素的查找概率由小到大重新排列,以便提高查找概率。

二分法查找:折半查找的效率比顺序查找高,但折半查找只适用于有序表,且限于顺序存储结构(对链式存储无效)。


typedef int ElemType;
//遍历输出容器对象
void print_vector(vector<ElemType> &vec){
	for(vector<ElemType>::iterator it=vec.begin(); it!=vec.end(); ++it)
		cout<<setw(5)<<*it;
	cout<<endl;
}

//顺序查找,返回索引值
int Search_Seq(vector<ElemType> &vec, ElemType key){
	vec[0] = key;			//第1个元素作为哨兵
	vector<ElemType>::reverse_iterator it = vec.rbegin();
	for(; *it!=key; ++it);	//逆序查找
	return vec.rend()-it;	//返回1表示找不到指定元素
}

//二分法查找,只适用于有序序列
int Search_Bin(vector<ElemType> &vec, ElemType key){
	vector<ElemType>::iterator low, high, mid;
	low = vec.begin();
	high = vec.end()-1;
	while(low <= high){
		mid = low+(high-low)/2;
		if(*mid == key)return mid-vec.begin()+1;
		else if(*mid > key)high = mid - 1;
		else	low = mid + 1;
	}
	return 1;
}

int main()
{
	//演示
	vector<ElemType> vec(11);
	for(int n=1; n<=10; ++n)
		vec[n] = 2*n+1;
	print_vector(vec);
	cout<<"顺序查找"<<endl;
	cout<<Search_Seq(vec,13)<<endl;
	cout<<"二分法查找"<<endl;
	cout<<Search_Bin(vec,13)<<endl;

	return 0;
}



结果:

    0    3    5    7    9   11   13   15   17   19   21
顺序查找
7
二分法查找
7

假设序列中有n个元素,且每个元素的查找概率相等,则顺序查找的平均查找长度为:(n+1)/2;二分法的平均查找长度为:log(n+1)-1

当然,上面是假设成功查找时的情况。如果待查找的元素不存在,则顺序查找的查找长度为(n+1);二分法的查找长度为 :[log(n)]+1。






分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics