一、顺序查找
1、顺序查找简单但速度慢
2、适合任意存储结构,不要去有序,适应结点的动态变化
template <class T>
int SeqSearch(T A[], int n, int key)
{
for(int i = 0; i < n; i++)
{
if(A[i].key == key)
{
return i;
}
}
return -1;
}
二、折半查找
1、有序存储的前提下
2、不适应结点的动态变化
3、在快速排序的方式下实现排序然后采用折半查找的方式。
template <class T>
int BinarySearch(T A[], int n, int key)//折半查找
{
int low, high , mid;
low = 0;
high = n - 1;
while(low <= high)
{
mid = (low + high)>>1;
if(key = A[mid].key)
{
return mid;
}
else if(key > A[mid].key)
{
low = mid + 1;//查找后半部分
}
else
{
high = mid - 1;
}
}
return -1;//未找到
}
三、分块查找
1、将线性表分解成若干块,块内结点任意存放,块与块之间必须排序。
2、为每一块取出关键字,然后建立索引表方式来进行查找,索引表是排序的因此可以通过折半排序方式查找关键字。
四、散列查找
1、目的是实现O(1)的时间复杂度,理想状态下创建最大关键字的数组长度来在每个不同位置存放不同的关键字,但很显然这样的话空间会太大,因此计划采用关键字转换的函数(散列函数)的方式来将关键字映射到较小的空间上进行访问结点的下标。
2、方法一采用除留余数法:选择合适的p去除关键字值余数对应散列值(p一般选为不大于散列表长度n的最大素数。
3、方法二用数字分析法:丢弃分布不均匀的位,留下分布均匀的位作为散列值——只适用于静态的关键字值集合
4、方法三用平方取中法:计算关键字的平方值,然后从平方值的中间位置选取连续的若干位作为散列值
5、方法四用随机乘数法:用随机实数f(0,1)之间,用 f × key的小数部分乘n(散列表的长度),把整数值作为散列值。
6、