用C语言,编程实现有序顺序表的折半查找(升序和降序)。
时间: 2024-02-09 11:11:17 浏览: 26
好的,下面是C语言代码实现有序顺序表的折半查找(升序和降序):
```c
#include <stdio.h>
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int length;
} SqList;
int BinarySearchAsc(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) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
int BinarySearchDesc(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) {
low = mid + 1;
} else {
high = mid - 1;
}
}
return -1;
}
int main() {
SqList L = { {1, 3, 5, 7, 9}, 5 };
int key = 5;
int index = BinarySearchAsc(L, key);
if (index != -1) {
printf("升序列表中找到%d,下标为%d\n", key, index);
} else {
printf("升序列表中未找到%d\n", key);
}
index = BinarySearchDesc(L, key);
if (index != -1) {
printf("降序列表中找到%d,下标为%d\n", key, index);
} else {
printf("降序列表中未找到%d\n", key);
}
return 0;
}
```
上面的代码中,我们定义了一个 `SqList` 结构体,表示有序顺序表,包含了数据数组和长度。然后我们分别实现了升序和降序的折半查找函数 `BinarySearchAsc` 和 `BinarySearchDesc`,并在 `main` 函数中测试了这两个函数。
在 `BinarySearchAsc` 和 `BinarySearchDesc` 函数中,我们使用了两个指针 `low` 和 `high` 分别指向表头和表尾,然后在循环中不断计算中间位置 `mid`,并将 `key` 与中间位置的元素进行比较。如果相等,就返回中间位置的下标;如果 `key` 比中间位置的元素大(升序)或小(降序),就把 `low` 或 `high` 指针往后或往前移动,缩小查找范围。如果最终没有找到,就返回 `-1`。