#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/*
1、顺序查找 On
*/
int sequence_search(vector<int> data, int val)
{
if (data.empty())
return -1;
for (int i = 0; i < data.size(); i++)
{
if (data[i] == val)
return i;
}
return -1;
}
/*
2、有序表 二分查找 Ologn
找到返回下标,否则返回-1
不适应频繁插入删除,因为需要重排序
*/
int binary_search(vector<int> data, int val)
{
if (data.empty())
return -1;
int low = 0;
int high = data.size() - 1;
int mid = 0;
while (low <= high)
{
mid = (low + high) / 2;
if (data[mid] == val)
return mid;
else if (data[mid] > val)//原表升序
high = mid - 1;
else
low = mid + 1;
}
return -1;
}
/*
3、插值查找Ologn,优化二分查找的mid
基于二分查找算法,将查找点的选择改进为自适应选择
表长较大,关键字分布比较均匀,平均性能比折半查找要好的多
*/
int interpolation_search(vector<int> data, int val)
{
if (data.empty())
return -1;
int low = 0;
int high = data.size() - 1;
int mid = 0;
while (low <= high)
{
mid = low+(val-data[low])/(data[high]-data[low])*(high-low);
if (data[mid] == val)
return mid;
else if (data[mid] > val)
high = mid - 1;
else
low = mid + 1;
}
return -1;
}
/*
4、斐波那契查找 Ologn
平均性能优于二分查找,当key=1时,效率低于二分查找
新数组包含F[k]-1个数,mid=low+F[k-1]-1
low-mid有F[k-1]-1个数,mid-high有F[k-2]-1个数
*/
const int F_maxsize = 20;
void Fibonacci(vector<int> &F)
{
F[0] = 1;
F[1] = 1;
for (int i = 2; i < F_maxsize; i++)
F[i] = F[i - 1] + F[i - 2];
}
int fibonacci_search(vector<int> data, int val)
{
if (data.empty())
return -1;
vector<int> F(F_maxsize, 0);
Fibonacci(F);//得到F_maxsize大小的fibonacci数列
int low = 0;
int high = data.size() - 1;
int mid = 0;
int k = 0;
while (data.size() > F[k] - 1)//让新数组记录个数为某个斐波那契数小1
++k;
vector<int> temp(F[k] - 1, 0);//分配大小为F[k]-1的temp,前面放data,多余放data的最后一个数
copy(data.begin(), data.end(), temp.begin());
for (int i = data.size(); i < F[k] - 1; i++)
temp[i] = data[data.size() - 1];
while (low <= high)
{
mid = low + F[k - 1] - 1;
if (temp[mid] > val)
{
high = mid - 1;
k -= 1;//往前 f数列下标-1
}
else if (temp[mid] < val)
{
low = mid + 1;
k -= 2;//往前 f数列下标-2
}
else
{
if (mid < data.size())
return mid;
else
return data.size() - 1;
}
}
return -1;
}
/*
5、二叉查找树查找 Ologn-On
6、平衡二叉树-红黑树、2-3树、B树、B+ 查找Ologn
7、哈希表查找 时间O1,若碰撞退化链表查询O同一索引元素个数 空间至少On
*/
int main()
{
int a[] = { 1,4,3,2,5,6 };
vector<int> data(a, a + 6);
sort(data.begin(), data.end());//升序排序
cout << "原序列:";
for (vector<int>::iterator it = data.begin(); it != data.end(); it++)
cout << *it << " ";
cout << endl;
cout << "1、顺序查找,下标为:" << sequence_search(data, 5) << endl;
cout << "2、升序有序表 二分查找,下标为:" << binary_search(data, 5) << endl;
cout << "3、升序有序表 插值查找,下标为:" << interpolation_search(data, 5) << endl;
cout << "4、斐波那契查找,下标为:" << fibonacci_search(data, 5) << endl;
}