关于顺序查找,如果设置一个“哨兵”,那么每次比较时不用判断i是否越界,这样可以减少查找所需的平均时间。
关于折半查找,需要注意两点:①while循环的条件是low<=high,因为key可能出现在low==mid时
②结束while循环时要返回0表示表中不存在待查元素
关于哈希查找:如果想要在源代码上直接修改,可以参考这篇文章:(1条消息) 8622 哈希查找 SCAU 华南农业大学 数据结构实验(个人笔记 勿喷)_木杏梦的博客-优快云博客
[作者:木杏梦]
这篇文章给出了修改源码的简单方式,概括的说,即以下两处:
①unsigned Hash(ElemType K)函数的内容是:return 3*K%length;
②void collision(int *p)函数的内容是:p=(*p+1)%length;
【第二处还可以通过修改函数调用参数方式为引用,这样函数内容就可以直接写为p++;即可】
本文是作者实现三种查找方式的代码的分享,其中哈希查找并非来自源代码的修改。
具体代码如下:
#include <stdio.h>
int Search_Seq(int Num[], int key, int n)
{
int i;
Num[0] = key; //设置“哨兵”,然后从高到低顺序查找
for (i = n; Num[0] != Num[i]; i--)
;
return i;
}
int Search_Bin(int Num[], int key, int n)
{
int low = 1, high = n;
while (low <= high)
{
int mid = (low + high) / 2;
if (Num[mid] == key)
return mid;
else
{
if (Num[mid] > key)
high = mid - 1;
else
low = mid + 1;
}
}
return 0; //表中不存在待查元素,返回0
}
double SearchLength = 0, count = 0; //SearchLength是查找长度,count是查找元素
void HxInsert(int Hlist[], int flaglist[], int Hx, int temp)
{
Hlist[Hx] = temp; //插入元素
flaglist[Hx] = 0; //表示此位置不可再插入元素
SearchLength++, count++; //寻找步数加一,查找元素个数加一
}
int main()
{
/*
int n;
scanf("%d", &n); //输入元素个数
int Num[n + 1];
for (int i = 1; i <= n; i++)
scanf("%d", &Num[i]); //输入元素
int key;
scanf("%d", &key); //输入关键字
*/
/*SCAU 8610
int loc = Search_Seq(Num, key, n);
if (loc)
printf("The element position is %d.\n", loc);
else
printf("The element is not exist.\n");
*/
/*SCAU 8621
int loc = Search_Bin(Num, key, n);
if (loc)
printf("The element position is %d.\n", loc - 1);
else
printf("The element is not exist.\n");
*/
/*SCAU 8622
int length, temp = 0;
scanf("%d", &length); //输入哈希表长度
int Hlist[length], flaglist[length]; //Hlist即哈希表,flaglist用于标志哪些位置可以被插入元素
for (int i = 0; i < length; i++)
flaglist[i] = 1;
scanf("%d", &temp); //输入第一个值
while (temp != -1)
{
int Hx = 3 * temp % length; //哈希函数
if (flaglist[Hx])
HxInsert(Hlist, flaglist, Hx, temp);
else
{
while (!flaglist[Hx]) //直到找到合适的位置插入
{
Hx++;
SearchLength++; //每找一次寻找步数加一
}
HxInsert(Hlist, flaglist, Hx, temp);
}
scanf("%d", &temp); //输入下一个待插入值
}
for (int i = 0; i < length; i++)
{
if (flaglist[i])
printf("X ");
else
printf("%d ", Hlist[i]);
}
printf("\nAverage search length=%lf", SearchLength / count);
*/
return 0;
}