本篇文章主要介绍数据结构中查找的基本概念,线性表的顺序查找算法,其中的代码全部使用c语言,如有错误希望大家多多指出。
目录
一,查找的基本概念
![](https://i-blog.csdnimg.cn/direct/a1341ab5d8e64f3f9b3dbc7f6eed78ac.png)
次关键字 反之,用以识别若干记录的关键字是次关键字
![](https://i-blog.csdnimg.cn/direct/671cd6b657dc40a19e621544245567c2.png)
二,线性表的查找
1.顺序查找
01 基本内容
应用范围:
顺序表或线性链表表示的静态查找表
表内元素之间无序
顺序表的表示:
typedef struct
{
ElemType *R; //表基址
int length; //表长
}SSTable;
在顺序表ST中查找值为key的数据元素
从头开始通过for循环遍历比较,如果key值相同返回位置信息
下面这种是从最后一个下标位置开始比较,for循环执行条件是查找的key值与线性表中某个位置key值不同,当相同时结束循环,则此时的下标位置就是要查找数据的位置;如果下标小于等于0则直接跳出循环,说明要找的数据不存在于线性表中。
下面这个相较于上面更一步简化算法,在for的条件里直接加入下标必须>0,此时若key值相同直接返回下标i的值。
但我们会发现上面的算法每执行一次循环,都要进行两次比较,是否能改进?
改进:把待查关键字key存入表头(“哨兵”),从后向前逐个比较,可免去查找过程中每一步都要检测是否查找完毕,加快速度。
int Search_Seq( SSTable ST , KeyType key )
{//若成功返回其位置信息,否则返回0
ST.R[0].key =key;
for( i=ST.length; ST.R[ i ].key!=key; - - i );
return i;
}
下面是一段完整的顺序查找实例:
#include <stdio.h>
// 顺序查找函数,返回目标元素在数组中的索引,如果未找到则返回-1
int sequential_search(int arr[], int n, int key) {
for (int i = 0; i < n; i++) {
if (arr[i] == key) {
return i; // 找到目标元素,返回其索引
}
}
return -1; // 未找到目标元素,返回-1
}
int main() {
int arr[] = {1, 3, 5, 7, 9, 11, 13, 15}; // 定义一个整数数组
int n = sizeof(arr) / sizeof(arr[0]); // 计算数组的长度
int key = 7; // 要查找的目标元素
int index = sequential_search(arr, n, key); // 调用顺序查找函数
if (index != -1) {
printf("Element %d found at index %d", key, index); // 如果找到目标元素,输出其索引
} else {
printf("Element %d not found in the array", key); // 如果未找到目标元素,输出提示信息
}
return 0;
}
02 性能分析
(1) 查找成功时的平均查找长度
设表中各记录查找概率相等
ASL s(n)=(1+2+ ... +n)/n =(n+1)/2
(2)查找不成功时的平均查找长度
ASL f =n+1
1、记录的查找概率不相等时如何提高查找效率?
非等概率查找时,可按照查找概率进行排序。
2、记录的查找概率无法测定时如何提高查找效率?
方法——按查找概率动态调整记录顺序:
(1)在每个记录中设一不访问频度域;
(2)始终保持记录按非递增有序的次序排列;
(3)每次查找后均将刚查到的记录直接移至表头。
顺序查找算法的特点:
优点:算法简单,对表结构无任何要求(顺序和链式)
缺点:n很大时查找效率较低