顺序查找和二分法查找
顺序查找:对表中的元素排序无要求,但如果表中各个元素的查找概率并不相等,则应先对元素的查找概率进行排序,使表中元素的查找概率由小到大重新排列,以便提高查找概率。
二分法查找:折半查找的效率比顺序查找高,但折半查找只适用于有序表,且限于顺序存储结构(对链式存储无效)。
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。