文章目录
1. 顺序查找
原理:按顺序比较每个元素,直到找到关键字为止
时间复杂度:O(n)
2. 分块查找
分块查找是顺序查找的优化方法。
原理:
- 先对索引表进行二分查找或顺序查找,以确定待查记录在哪一块中
- 然后,在已确定的块中进行顺序查找
3. 二分查找
前提:有序数据
//二分查找(折半查找),版本1
int BinarySearch1(int a[], int value, int n)
{
int low, high, mid;
low = 0;
high = n-1;
while(low<=high)
{
mid = (low+high)/2;
if(a[mid]==value)
return mid;
if(a[mid]>value)
high = mid-1;
if(a[mid]<value)
low = mid+1;
}
return -1;
}
//二分查找,递归版本
int BinarySearch2(int a[], int value, int low, int high)
{
int mid = low+(high-low)/2;
if(a[mid]==value)
return mid;
if(a[mid]>value)
return BinarySearch2(a, value, low, mid-1);
if(a[mid]<value)
return BinarySearch2(a, value, mid+1, high);
}
4. 斐波那契查找
斐波那契查找是对二分查找的优化,将分割使用的中点改为黄金分割点
思路:
- 生成一个斐波那契数列
5. 插值查找
插值查找也是对二分查找的优化。二分查找选取中间位置,插值查找则通过查找值判定大概位于序列的哪个位置比例。
选择下标 = left + (right - left) * (key - arr[left])/(arr[right] - arr[left])