用c语言实现算法1:采用顺序存储结构创建静态查找表,对查找表进行顺序查找和 改进的顺序查找,并对其查找效率进行比较:
时间: 2024-05-10 19:19:13 浏览: 129
C语言实现静态顺序表的实例详解
顺序查找是最简单的查找算法,它是在一个无序表中按照顺序逐个比较每个元素的值和要查找的元素值,直到找到该元素或者查找完整个表。下面是用 C 语言实现顺序查找的代码:
```c
int seq_search(int a[], int n, int key) {
for (int i = 0; i < n; i++) {
if (a[i] == key) {
return i;
}
}
return -1;
}
```
其中,a 是存放元素的数组,n 是数组长度,key 是要查找的元素值。返回值是该元素在数组中的下标,如果没有找到则返回 -1。
改进的顺序查找是通过优化顺序查找算法的比较次数来提高查找效率。具体做法是将要查找的元素与数组的末尾元素比较,如果相等则直接返回结果,否则将末尾元素赋值给临时变量,然后将要查找的元素放到数组的末尾位置,这样下一次查找时就可以省去比较数组最后一个元素的时间。下面是用 C 语言实现改进的顺序查找的代码:
```c
int seq_search2(int a[], int n, int key) {
int i = n - 1;
a[0] = key; // 哨兵
while (a[i] != key) {
i--;
}
return i;
}
```
其中,哨兵是一个特殊值,它被放在数组的第一个位置上,可以避免查找过程中的越界问题。
下面是用 C 语言实现顺序存储结构的静态查找表的代码:
```c
#include <stdio.h>
#define MAXSIZE 100
typedef struct {
int key;
char data;
} ElemType;
typedef struct {
ElemType elem[MAXSIZE];
int length;
} SSTable;
void create(SSTable *st) {
printf("请输入元素个数:");
scanf("%d", &st->length);
printf("请输入各元素的值和数据:\n");
for (int i = 0; i < st->length; i++) {
scanf("%d %c", &st->elem[i].key, &st->elem[i].data);
}
}
void print(SSTable st) {
printf("静态查找表的内容如下:\n");
for (int i = 0; i < st.length; i++) {
printf("%d %c\n", st.elem[i].key, st.elem[i].data);
}
}
int main() {
SSTable st;
create(&st);
print(st);
return 0;
}
```
其中,ElemType 是存放元素的结构体类型,包括一个键值 key 和一个数据 data。SSTable 是静态查找表类型,包括一个 ElemType 类型的数组 elem 和一个数组长度 length。
为了比较顺序查找和改进的顺序查找的效率,可以用一个随机生成的数组来测试。下面是测试代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAXSIZE 1000000
typedef struct {
int key;
char data;
} ElemType;
typedef struct {
ElemType elem[MAXSIZE];
int length;
} SSTable;
int seq_search(int a[], int n, int key) {
for (int i = 0; i < n; i++) {
if (a[i] == key) {
return i;
}
}
return -1;
}
int seq_search2(int a[], int n, int key) {
int i = n - 1;
a[0] = key; // 哨兵
while (a[i] != key) {
i--;
}
return i;
}
void create(SSTable *st) {
printf("请输入元素个数:");
scanf("%d", &st->length);
printf("请输入各元素的值和数据:\n");
for (int i = 0; i < st->length; i++) {
scanf("%d %c", &st->elem[i].key, &st->elem[i].data);
}
}
void print(SSTable st) {
printf("静态查找表的内容如下:\n");
for (int i = 0; i < st.length; i++) {
printf("%d %c\n", st.elem[i].key, st.elem[i].data);
}
}
int main() {
int a[MAXSIZE];
srand(time(NULL));
for (int i = 0; i < MAXSIZE; i++) {
a[i] = rand() % MAXSIZE + 1;
}
clock_t start, end;
start = clock();
int index = seq_search(a, MAXSIZE, MAXSIZE);
end = clock();
printf("顺序查找的结果为:%d,用时 %ld 毫秒\n", index, end - start);
start = clock();
index = seq_search2(a, MAXSIZE, MAXSIZE);
end = clock();
printf("改进的顺序查找的结果为:%d,用时 %ld 毫秒\n", index, end - start);
SSTable st;
create(&st);
print(st);
return 0;
}
```
其中,用 srand() 函数和 rand() 函数生成一个随机数组 a,数组长度为 MAXSIZE。然后分别测试顺序查找和改进的顺序查找对于数组中最大值的查找效率。最后创建一个静态查找表并打印输出。
测试结果表明,改进的顺序查找的效率要比顺序查找高很多,而静态查找表的创建则与查找算法的效率无关。
阅读全文