查找相关算法实现
在数据结构与算法学习过程中,为更加深刻理解算法的实现,本文对课程中查找部分算法进行了实现。本文仅提供算法代码参考,相关算法详解请参考青岛大学王卓老师的视频课程:数据结构与算法基础(青岛大学-王卓)
查找相关算法
定义标识符
#include <cstdlib>
#include <iostream>
using namespace std;
// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define MAXSIZE 100
//Status 是函数的类型,其值是函数结果状态代码
typedef int Status;
typedef int KeyType;
定义数据表结构
typedef struct {
KeyType key; // 关键字域
int data; // 数据域
}ElemType;
typedef struct{ // 顺序表结构类型定义
ElemType* R; // 表地址
int length; // 表长
}SSTable;
无序顺序查找
// 无序顺序查找
int Search_Seq(SSTable ST, KeyType key) {
// 若成功返回位置信息,否则返回0
int i;
ST.R[0].key == key; // 哨兵,不必判断循环是否越界
for (i = ST.length; ST.R[i].key != key; --i);
return i;
}
有序折半查找 - 非递归算法
// 有序折半查找 - 非递归算法
int Search_Bin(SSTable ST, KeyType key) {
int low = 1;
int high = ST.length; // 置区间初值
while (low <= high) {
int mid = (low + high) / 2;
if (ST.R[mid].key == key)return mid;// 找到待查元素
else if (key < ST.R[mid].key) { // 缩小查找区间
high = mid - 1; // 继续在前半区间进行查找
}
else low = mid + 1; // 继续在后半区间进行查找
}
return 0; // 顺序表中不存在待查元素
} // Search_Bin
有序折半查找 - 递归算法
// 有序折半查找 - 递归算法
int Search_Bin_r(SSTable ST, KeyType key, int low, int high) {
if (low > high)return 0; // 查找不到时返回0
int mid = (low + high) / 2;
if (key == ST.R[mid].key) return mid;
else if (key < ST.R[mid].key) Search_Bin_r(ST, key, low, mid - 1); // 在前半区查找
else Search_Bin_r(ST, key, mid + 1, high); // 在后半区间查找
}
测试代码及结果
测试代码:
int main()
{
SSTable ST;
ElemType R[MAXSIZE];
int index;
int datas[] = { 2,4,7,9,10,31 };
KeyType keys[] = { 2,4,7,9,10,31 };
cout << "为ST赋值" << endl;
ST.length = 6;
for (int i =1; i <= 6; i++) {
cout << i << " 的key为: " << keys[i-1] << endl;
R[i].data = datas[i-1];
R[i].key = keys[i-1];
}
ST.R = R;
cout << "查找key=7的位置" << endl;
index = Search_Seq(ST,7);
cout << "顺序查找结果: " << index << endl;
index = Search_Bin(ST,7);
cout << "有序折半查找(非递归)结果: " << index << endl;
index = Search_Bin_r(ST, 7, 1, 6);
cout << "有序折半查找(递归)结果: " << index << endl;
system("pause");
return OK;
}