模板设计
顺序查找:遍历整个元素序列,逐个元素与要查找的元素进行比较,若其中有某个元素与该值相等,则查找成功(返回该元素的下标),若遍历完了整个序列,都没有找到与之相等的元素,则返回-1。
二分查找:对元素序列进行排序,排序之后,将要查找的值与排序的中间值比较,小于中间值,则到左边查找,大于中间值,到右边查找,递归循环,直到最终找到该值,返回它的下标或者查找序列中只剩下一个值,但它与要查找的值不相等,返回-1。
功能介绍
代码
main.cpp
#include<iostream>
#include"search.h"
int main()
{
cout<<"创建一个数组a"<<endl;
cout<<"数组的元素为:{1,5,3,6,9}"<<endl;
cout<<endl;
int a[] = {1,5,3,6,9};
cout<<"顺序查找 3 "<<endl<<"若3在数组里,则返回3的位置(从1开始),若不在,则返回 -1"<<endl;
int cur = search(a, 3);
cout<<"输出结果:"<<cur<<endl;
cout<<endl;
cout<<"二分查找 7"<<endl<<"若7在数组里,则返回7的位置(从1开始),若不在,则返回 -1"<<endl;
cur = binary_search(a,7);
cout<<"输出结果:"<<cur<<endl;
return 0;
}
/*
search(T a,int b)
binary_search(T a,int b)
*/
search.h
#include<iostream>
#include<algorithm>
using namespace std;
template <typename T> int getsize(T &array)
{
return sizeof(array)/sizeof(array[0]);
}
template <typename T> int search(T &a,int b)
{
int len = getsize(a);
int cur = -1;
for(int i=0;i<len;i++)
if(a[i] == b) cur = i+1;
return cur;
}
template <typename T> int binary_search(T &a,int b)
{
int len = getsize(a);
int *d = a ;
sort(d,d+len);
// for(int i=0;i<len;i++)
// cout<<d[i]<<" ";cout<<endl;
int cur = -1;
int low = 0,high = len-1;
while(low<high)
{
int mid = (int)(low +high)/2;
// cout<<"mid:"<<mid<<endl;
// cout<<"b:"<<b<<" "<<d[mid]<<endl;
if(b == d[mid]) { cur = mid; break;}
else if(b < d[mid]) low = mid;
else high = mid;
}
return cur;
}