查找的定义是:对给定的一个关键字的值,在数据表中搜索出一个关键字的值等于该值的记录或者元素,若找到了指定的元素,则称为查找成功,通常是返回该元素在查找表中的位置;若不存在指定的元素,则返回一个表示失败的值。
查找算法根据存储数据的结构不同可以分为以下三种:顺序表,也就是数组、树表、散列表等
其中,顺序表根据数据元素是否按顺序排序又可以分为:简单顺序查找(数组元素无序)、二分查找(数组有序)
简单顺序查找:
就是从下表1开始依次比较待查找的元素和数组内元素是否相等,若相等,就返回该元素的下表,否则就返回0;
这里将待查找的元素放在b[0]的位置,是为了避免越界的判断,这样可以节省一半的时间
#include <iostream>
using namespace std;
const int MAX = 10;
int seq_search(int b[],int num,int length){
int i = length;
while(b[i] != num)
i--;
return i;
}
int main(){
int num;
cin>>num; //要查找的元素
int a[] = {3,1,3,7,4,6,5};
int length = sizeof(a)/sizeof(int);
int b[MAX];
for(int i=0;i<=length;i++){
if(i == 0)
b[i] = num; //将b[0]默认置为要查找的元素,避免越界判断
else
b[i] = a[i-1];
}
int position = seq_search(b,num,length);
cout<<position<<endl; //输出元素所在的位置,没找到的话 输出0
return 0;
}
二分查找(数组有序):
1.非递归写法
设置三个标号,low,mid,high,发现如果mid对应的值等于待查找的元素的值,返回mid+1;若待查找的元素小于mid对应的值,则从左边开始找;否则从右边开始找
#include <iostream>
using namespace std;
int bin_search(int *a,int num,int length){
int mid;
int low = 0,high = length-1;
while(low<=high){
mid = (low + high)/2;
if(num == a[mid]) return mid+1;
else if(num < a[mid]) high = mid-1;
else low = mid+1;
}
return -1;
}
int main(){
int a[] = {1,2,3,4,5,6,7,8,9}; //供查找的有序表
int length = sizeof(a)/sizeof(int);
int num; //待查找的元素
cin>>num;
int position = bin_search(a,num,length);
cout<<position<<endl;
}
2.递归写法
#include <iostream>
using namespace std;
int bin_search(int *a,int num,int low,int high){
int mid;
if(low > high) return -1;
else{
mid = (low + high)/2;
if(num == a[mid]) return mid+1;
else if(num < a[mid])
return bin_search(a,num,low,mid-1);
else
return bin_search(a,num,mid+1,high);
}
}
int main(){
int a[] = {1,2,3,4,5,6,7,8,9}; //供查找的有序表
int length = sizeof(a)/sizeof(int);
int num; //待查找的元素
cin>>num;
int position = bin_search(a,num,0,length-1);
cout<<position<<endl;
}