这一节,介绍以数组为载体的查找方法,介绍两种查找方法:顺序查找和二分查找
(1)顺序查找
顺序查找,顾名思义,按照元素索引的顺序进行查找以匹配要查找的目标,是针对无序数组的通用查找手段。
算法思路是:从数组的首个元素开始,逐个匹配数组元素和查找目标,若找到,返回找到的元素索引,若遍历完没有找到,则返回-1。
(2)二分查找
二分查找,又名折半查找,是处理已排序数组的快速查找方式。
算法思路是:每次对数组区间中间的元素和查找目标进行匹配和比较,如果不匹配,根据大小关系选择左区间或者右区间再进行比较,直到区间只剩下一个元素或者匹配为止。若找到(匹配),返回找到的元素索引,若没有找到,则返回-1。
以整型数组为例,给出这两个查找方法的C++实例。
#include<iostream>
using namespace std;
void QuickSort(int num[],int left,int right){
if(left>=right) return;//待排序区间只有一个元素 终止
int key,i,j;
i=left;//从左往右查找变量
j=right;//从右往左查找变量
key=num[left];//参考数
while(i<j){
while(num[j]>=key && j>i) j--;//从右往左查找
while(num[i]<=key && i<j) i++;//从左往右查找
if(i<j){
int tmp=num[i];
num[i]=num[j];
num[j]=tmp;
} //交换
}
num[left]=num[i];
num[i]=key;//参考数归位
QuickSort(num,left,i-1);//对i左边区间排序
QuickSort(num,i+1,right);//对i右边区间排序
}
int Search(int num[],int n,int find){
for(int i=0;i<n;i++){
if(num[i]==find) return i;
}
return -1;
}
int BinarySearch(int num[],int n,int find){
int left,right,mid;
left=0;
right=n-1;
while(left<=right){
mid=left+(right-left)/2;//防止数组越界 不写直接加和
if(mid<find) left=mid+1;
else if(mid>find) right=mid-1;
else return mid;
}
return -1;
}
int main()
{
int num[10]={4,7,1,0,8,9,3,2,5,6};
int find;
for(int i=0;i<10;i++) cout<<num[i]<<" ";
cout<<endl;
//case 1
cout<<"输入要查找的数:"<<endl;
cin>>find;
cout<<"查找的索引为:"<<endl;
cout<<Search(num,10,find)<<endl;
//case 2
cout<<"对数组进行快速排序变为有序数组:"<<endl;
QuickSort(num,0,9);
for(int i=0;i<10;i++) cout<<num[i]<<" ";
cout<<endl;
cout<<"输入要查找的数:"<<endl;
cin>>find;
cout<<"查找的索引为:"<<endl;
cout<<BinarySearch(num,10,find)<<endl;
system("pause");
return 0;
}