数据结构查找算法实战
查找是数据处理中最基础也最核心的操作之一。从简单的线性表遍历到复杂的树形索引,不同的场景需要匹配不同的查找策略。本文将通过一系列经典题目,结合代码实现与逻辑推导,带你深入理解顺序查找、折半查找以及树形查找(如二叉排序树)的核心机制。
顺序查找与优化
最基本的顺序查找适用于无序表。但在实际应用中,如果某些数据被频繁访问,我们可以采用'移动至前端'的策略来优化性能。
顺序查找优化
当线性表中各结点的检索概率不等时,若找到指定结点,可将其与前驱结点交换,使高频数据尽量靠前。
int SeqSrch(RcdType R[], ElemType k, int n) {
int i = 0;
// 从前向后顺序查找
while ((R[i].key != k) && (i < n)) {
i++;
}
// 若找到且非第一个元素,则交换位置
if (i < n && i > 0) {
RcdType temp = R[i];
R[i] = R[i - 1];
R[i - 1] = temp;
return i - 1;
}
return -1;
}
对于链表实现,基本思想相似,但需注意在交换结点前保存指向前一结点的指针,避免断链。

有序表查找:折半查找
对于有序表,折半查找(二分查找)能显著提升效率。其核心在于每次将查找区间缩小一半。
typedef struct {
ElemType *elem;
int length;
} SSTable;
int BinSearchRec(SSTable ST, ElemType key, int low, int high) {
if (low > high) return 0;
int mid = (low + high) / 2;
if (key > ST.elem[mid]) {
BinSearchRec(ST, key, mid + , high);
} (key < ST.elem[mid]) {
BinSearchRec(ST, key, low, mid - );
} {
mid;
}
}









