顺序查找和二分法查找
顺序查找:对表中的元素排序无要求,但如果表中各个元素的查找概率并不相等,则应先对元素的查找概率进行排序,使表中元素的查找概率由小到大重新排列,以便提高查找概率。
二分法查找:折半查找的效率比顺序查找高,但折半查找只适用于有序表,且限于顺序存储结构(对链式存储无效)。
假设序列中有n个元素,且每个元素的查找概率相等,则顺序查找的平均查找长度为:(n+1)/2;二分法的平均查找长度为:log(n+1)-1。
当然,上面是假设成功查找时的情况。如果待查找的元素不存在,则顺序查找的查找长度为(n+1);二分法的查找长度为 :[log(n)]+1。
- 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;
- }
阅读(422) | 评论(0) | 转发(0) |