/*******************************
查找基本概念:
若关键字能够唯一的标识一个数据元素,则称该关键字为主关键字。
能识别多个数据元素(或记录)的关键字,称之为次关键字。
***********************************/
int sequentialSerch(int *serchTable, int length, int key)
{
int index;
for (index = 1; index <= length; index++)
{
if (serchTable[index] == key)
{
return index;
}
}
return 0;
}
int advanceSS(int *serchTable, int length, int key)
{
int index = length;
serchTable[0] = key; // 在查找尽头设置哨兵
while (serchTable[index] != key)
{
--index;
}
return index;
}
/******************************************************
折半查找的要求:
1,线性表的记录是按关键字排序的
2,线性表必须采用顺序存储结构。
折半查找的时间复杂度:
具有N个结点的完全二叉树的深度为不大于logN的整数+1,所以最坏的情况查找次数是logN的整数+1
时间复杂度为O(logN)
插值查找:总体和折半查找相同,计算mid改进了。mid = low + (key - a[low])/(a[high] - a[low])*(high - low)
该算法只是用于分布均匀的表。
***********************************************************/
int bitSearch(int *serchTable, int length, int key)
{
int low = 1; //从1开始,避免与查找不到的情况混淆。
int high = length;
int mid;
// int index;
while (low <= high)
{
mid = (low + high) / 2;
if (serchTable[mid] > key)
{
low = mid + 1; //把搜索区间改为中间位置的右半区域
}
else if (serchTable[mid] < key)
{
high = mid - 1; //把搜索区间改为中间位置的左半区域
}
else
{
return mid;
}
}
return 0;
}
/******************************************************
斐波那契查找:
斐波那契查找的核心是:
1)当key=a[mid]时,查找成功;
2)当key<a[mid]时,新的查找范围是第low个到第mid-1个,此时范围个数为F[k-1] - 1个,即数组左边的长度,
所以要在[low, F[k - 1] - 1]范围内查找;
3)当key>a[mid]时,新的查找范围是第mid+1个到第high个,此时范围个数为F[k-2] - 1个,即数组右边的长度,
所以要在[F[k - 2] - 1]范围内查找。
**********************************************************/
#define MAXSIZE 20
void fibonacciArr(int *f)
{
int index;
f[0] = 0;
f[1] = 1;
for (index = 2; index < MAXSIZE; index++)
{
f[index] = f[index - 1] + f[index - 2];
}
}
int FibonacciSearch(int *serchTable, int length, int key)
{
int low = 1;
int high = length;
int mid;
int k = 0;
int index;
int F[MAXSIZE];
fibonacciArr(F);
while (length < F[k] - 1) //求length在F[]中的位置
{
++k;
}
/********************************************************************************************************
如果一个有序表的元素个数为n,并且n正好是(某个斐波那契数 - 1),即n=F[k]-1时,才能用斐波那契查找法。
如果有序表的元素个n不等于(某个斐波那契数 - 1),即n≠F[k]-1,
这时必须要将有序表的元素扩展到 (大于n的那个斐波那契数 - 1) 才行.
*******************************************************************************************************/
for (index = length; index < F[k] - 1; index++) //
{
serchTable[index] = serchTable[length];
}
while (low <= high)
{
mid = low + F[k-1] - 1;
//斐波那契查找求mid公式,mid把当前区间[low,high]分成两个区间:[low, low + F[k-1] - 2]和[low + F[k-1], high]
//前一个区间的长度为F[k-1] - 1,后一个区间长度为 high - (low + F[k-1]) = F[k] - 1 - F[k-1] = F(k - 2) - 1
//根据情况更新相应的low 或 high的值
if (serchTable[mid] > key)
{
high = low - 1;
k = k - 1;
}
else if (serchTable[mid] > key)
{
low = low + 1;
k = k - 2;
}
else
{
if (low > length)
{
return length;
}
else
{
return low;
}
}
}
return 0;
}
int main()
{
return 0;
}
//斐波那契查找原理解析:http://blog.chinaunix.net/uid-27164517-id-3313988.html