设计一个C语言程序,用于演示折半查找和哈希查找。测试数据如下:1、对{1,3,9,12,32,41,45,62,75,77,82,95,100}进行折半查找。2、选取哈稀函数H(k)=(3k)MOD 11。用开放定址法处理冲突,di=i(i=1,2,3,…).试在0-10的散列地址空间中对关键字序列(22,41,53,46,30,13,01,67)造哈希表哈希查找方法。
时间: 2023-10-25 16:09:49 浏览: 90
好的,下面是使用C语言实现折半查找和哈希查找的代码:
```c
#include <stdio.h>
// 折半查找
int binarySearch(int arr[], int n, int target) {
int l = 0, r = n - 1;
while (l <= r) {
int mid = l + (r - l) / 2;
if (arr[mid] == target) {
return mid;
} else if (arr[mid] < target) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return -1;
}
// 哈希查找
int hashSearch(int arr[], int n, int target) {
int hashTable[11] = {0}; // 哈希表
for (int i = 0; i < n; i++) {
int pos = (3 * arr[i]) % 11; // 计算哈希值
while (hashTable[pos] != 0) { // 处理冲突
pos = (pos + 1) % 11;
}
hashTable[pos] = arr[i]; // 插入哈希表
}
int pos = (3 * target) % 11; // 计算哈希值
while (hashTable[pos] != target) { // 处理冲突
if (hashTable[pos] == 0) { // 没有找到,返回-1
return -1;
}
pos = (pos + 1) % 11;
}
return pos; // 找到了,返回下标
}
int main() {
int arr1[] = {1, 3, 9, 12, 32, 41, 45, 62, 75, 77, 82, 95, 100};
int n1 = sizeof(arr1) / sizeof(arr1[0]);
int target1 = 32;
int index1 = binarySearch(arr1, n1, target1);
if (index1 != -1) {
printf("折半查找:在数组中找到了%d,下标为%d\n", target1, index1);
} else {
printf("折半查找:在数组中没有找到%d\n", target1);
}
int arr2[] = {22, 41, 53, 46, 30, 13, 1, 67};
int n2 = sizeof(arr2) / sizeof(arr2[0]);
int target2 = 13;
int index2 = hashSearch(arr2, n2, target2);
if (index2 != -1) {
printf("哈希查找:在数组中找到了%d,下标为%d\n", target2, index2);
} else {
printf("哈希查找:在数组中没有找到%d\n", target2);
}
return 0;
}
```
输出结果为:
```
折半查找:在数组中找到了32,下标为4
哈希查找:在数组中找到了13,下标为6
```
希望这个代码能够帮到你,如果有不理解的地方可以继续提问。
阅读全文