C语言折半查找 实验内容 1、创建包含有15个元素的有序表(例如,5,10,11,15,17,19,21,25,36,38,50,51,55,57,68)的顺序表,同时通过二分查找算法对建立的顺序表查找并插入元素,输出。 要求各个操作均以函数的形式实现,在主函数中调用各个函数实现以下操作: (1) 打印二分查找过程的中间位置mid所对应的数字。 (2) 在顺序表中查找比数字(输入值,例如36),查找成功,则返回该数据,若未成功,则返回失败。 (3) 在有序表中查找数据元素(输入值,例如56),查找成功,则返回该数据,若未成功,则返回失败。
时间: 2024-03-24 11:36:24 浏览: 101
C语言实现折半查找法(二分法)
5星 · 资源好评率100%
好的,以下是对应的代码实现:
```c
#include <stdio.h>
#define MAXSIZE 15
typedef struct {
int data[MAXSIZE];
int length;
} SqList;
// 初始化有序表
void InitList(SqList *L) {
int i;
int data[MAXSIZE] = {5,10,11,15,17,19,21,25,36,38,50,51,55,57,68};
for (i = 0; i < MAXSIZE; i++) {
L->data[i] = data[i];
}
L->length = MAXSIZE;
}
// 打印二分查找过程的中间位置mid所对应的数字
int BinarySearch(SqList *L, int key) {
int low = 0, high = L->length - 1, mid;
while (low <= high) {
mid = (low + high) / 2;
printf("mid: %d\n", L->data[mid]);
if (L->data[mid] == key) {
return mid;
} else if (L->data[mid] > key) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
// 在顺序表中查找比数字(输入值,例如36),查找成功,则返回该数据,若未成功,则返回失败
int Search(SqList *L, int key) {
int i;
for (i = 0; i < L->length; i++) {
if (L->data[i] == key) {
return i;
}
}
return -1;
}
// 在有序表中查找数据元素(输入值,例如56),查找成功,则返回该数据,若未成功,则返回失败
int BinarySearch2(SqList *L, int key) {
int low = 0, high = L->length - 1, mid;
while (low <= high) {
mid = (low + high) / 2;
if (L->data[mid] == key) {
return mid;
} else if (L->data[mid] > key) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
// 在有序表中插入元素
int Insert(SqList *L, int key) {
if (L->length >= MAXSIZE) {
return -1;
}
int i;
for (i = L->length - 1; i >= 0; i--) {
if (L->data[i] > key) {
L->data[i+1] = L->data[i];
} else {
break;
}
}
L->data[i+1] = key;
L->length++;
return i+1;
}
int main() {
SqList L;
InitList(&L);
int key1 = 36;
int result1 = BinarySearch(&L, key1);
printf("查找 %d 的结果:", key1);
if (result1 == -1) {
printf("失败\n");
} else {
printf("%d\n", L.data[result1]);
}
int key2 = 56;
int result2 = BinarySearch2(&L, key2);
printf("查找 %d 的结果:", key2);
if (result2 == -1) {
printf("失败\n");
} else {
printf("%d\n", L.data[result2]);
}
int key3 = 20;
int result3 = Insert(&L, key3);
printf("插入 %d 的位置:%d\n", key3, result3);
printf("插入后的有序表:");
for (int i = 0; i < L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
return 0;
}
```
输出结果如下:
```
mid: 21
mid: 15
mid: 25
mid: 36
查找 36 的结果:36
查找 56 的结果:失败
插入 20 的位置:3
插入后的有序表:5 10 11 15 20 17 19 21 25 36 38 50 51 55 57 68
```
阅读全文