一、算法分析
- 顺序查找算法:从第一个元素开始,逐个比较相邻的元素,直到找到目标元素或遍历完整个序列,第0个元素为哨兵,标记查找结束。
- 折半查找算法:首先对有序序列进行二分,然后根据目标值与中间元素的比较结果,确定目标值在左半部分还是右半部分,然后递归处理,直到找到目标值或无法划分。
注:折半查找只能在有序数列中使用。
二、代码实现
顺序查找:
//顺序查找
int Search_Seq(SSTable L, int key) {
int i;
L.data[0] = key;//哨兵
for (i = L.length; L.data[i] != key; --i);
return i;//当查找失败时返回0
}
折半查找:
//折半查找(递归)
int Search_Bin(SSTable L, int key, int l, int r) {
//递归结束条件
if (l > r) return 0;
int low = l, high = r, mid = low + high >> 1;
if (L.data[mid] == key) return mid;
else if (L.data[mid] > key) return Search_Bin(L, key, l, mid - 1);
else return Search_Bin(L, key, mid + 1, r);
}
完整代码:
#include<stdio.h>
#include<stdlib.h>
#define Maxsize 1010
typedef struct {
int data[Maxsize];
int length;
}SSTable;
bool InitSSTable(SSTable* L) {
L->length = 0;
return true;
}
//顺序查找
int Search_Seq(SSTable L, int key) {
int i;
L.data[0] = key;//哨兵
for (i = L.length; L.data[i] != key; --i);
return i;//当查找失败时返回0
}
//折半查找(递归)
int Search_Bin(SSTable L, int key, int l, int r) {
//递归结束条件
if (l > r) return 0;
int low = l, high = r, mid = low + high >> 1;
if (L.data[mid] == key) return mid;
else if (L.data[mid] > key) return Search_Bin(L, key, l, mid - 1);
else return Search_Bin(L, key, mid + 1, r);
}
int main() {
SSTable L;
InitSSTable(&L);
int n, key, pos;
scanf("%d %d", &n, &key);
for (int i = 1; i <= n; i++, L.length++)
scanf("%d", &L.data[i]);
//pos = Search_Seq(L, key);
pos = Search_Bin(L, key, 1, L.length);
printf("%d\n", pos);
return 0;
}