一.顺序查找
顺序查找是按照序列原有顺序对数组进行遍历比较查询的基本查找算法,也叫线性查找。
基本原理:对于任意一个序列以及一个给定的元素,将给定元素与序列中元素依次比较,直到找出与给定关键字相同的元素,或者将序列中的元素与其都比较完为止。
int Seqsch(ElemType A[ ],int n,KeyType K) {
//从顺序表A的n个元素中顺序查找关键字为K的元素,若成功返回其下标,否则返回-1
int i;
for( i=0;i<n;i++){
if(A[i].key==K)
break;
}
if(i<=n-1) //查找成功返回下标,否则返回-1
return i;
else return -1;
}
二.二分查找
二分查找也称折半查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
基本思想:将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止;如果x<a[n/2],则只要在数组a的左半部分继续搜索x, 如果x>a[n/2],则只要在数组a的右半部搜索x.
要求:
1.必须采用顺序存储结构。
2.必须按关键字大小有序排列。
int BinSearch(SeqList *R,int n,KeyType K)
{
//在有序表R[0..n-1]中进行二分查找,成功时返回结点的位置,失败时返回-1
int low=0,high=n-1,mid; //置当前查找区间上、下界的初值
while(low<=high)
{
if(R[low].key==K)
return low;
if(R[high].key==k)
return high; //当前查找区间R[low..high]非空
mid=low+(high-low)/2;
/*使用(low+high)/2会有整数溢出的问题
(问题会出现在当low+high的结果大于表达式结果类型所能表示的最大值时,
这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)
不存在这个问题*/
if(R[mid].key==K)
return mid; //查找成功返回
if(R[mid].key<K)
low=mid+1; //继续在R[mid+1..high]中查找
else
high=mid-1; //继续在R[low..mid-1]中查找
}
if(low>high)
return -1;//当low>high时表示所查找区间内没有结果,查找失败
}
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
class Solution {
public:
int search(vector<int>& nums, int target) {
int low = 0, high = nums.size() - 1;
while(low <= high){
int mid = (high - low) / 2 + low;
int num = nums[mid];
if (num == target) {
return mid;
} else if (num > target) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
};
vector< int > &nums:nums为一个引用,引用的内容是vector这个容器内部存放的整型数据
获取长度
nums.size();