顺序查找C++实现(哨兵设置在数组下标高端)

设置“哨兵”,哨兵就是待查值,将它放在查找方向的“尽头”处,免去了在查找过程中每一次比较后都要判断查找位置是否越界,从而提高查找速度。

顺序查找伪代码描述如下:

1、设置哨兵;

2、初始化查找的起始下标i=n;

3、若r[i]与k相等,则返回当前i的值;否则,继续比较前一个记录;

c++实现如下:

#include <iostream>
using namespace std;
const int MaxSize = 20;
class SeqList
{
public:
	SeqList(int a[], int k);//建立一个长度为k的顺序表
	int SeqSearch(int k);//顺序查找函数
private:
	int data[MaxSize];
	int length;
};
SeqList::SeqList(int a[], int k)
{
	while (k < MaxSize)
	{
		for (int i = 0; i < k; i++)
			data[i] = a[i];
		length = k;//length对应数组下标高端存放哨兵的位置
		break;
	}
}
int SeqList::SeqSearch(int k)
{
	data[length] = k;//在数组下标高端设置哨兵
	int i = 0;
	while (data[i] != k)
		i++;
	return i;
}
int main()
{
	int b[] = { 7,14,18,21,23,29,31,35,38,42,46,49,52 }, n(13), k, t;
	SeqList Seq(b, n);
	cout << "输入查找值k:"; cin >> k;
	t = Seq.SeqSearch(k);
	if (t < n)cout << k << "对应的下标为:" << t << endl;
	else cout << k << "不在该序列之中" << endl;
	return 0;
}
  • 6
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C++设计顺序表的顺序查找算法,并将哨兵设在下标高端的程序代码如下: ```c++ #include <iostream> using namespace std; const int MAXSIZE = 100; // 定义顺序表最大长度 struct SeqList { int data[MAXSIZE]; int length; }; // 顺序查找函数,将哨兵设在下标高端 int sequentialSearch(SeqList &L, int key) { L.data[0] = key; // 将关键字存放在哨兵位置 int i = L.length; // 从顺序表的最后一个元素开始查找 while (L.data[i] != key) { i--; } return i; // 返回查找结果 } int main() { SeqList L; L.length = 5; L.data[0] = 2; L.data[1] = 4; L.data[2] = 6; L.data[3] = 8; L.data[4] = 10; int key = 6; int pos = sequentialSearch(L, key); if (pos == 0) { cout << "查找失败!" << endl; } else { cout << "查找成功!" << endl; cout << "元素 " << key << " 的位置为 " << pos << endl; } return 0; } ``` 在上述代码中,我们定义了结构体 `SeqList` 来表示顺序表,其中包含一个数组 `data` 和一个整型变量 `length`,分别用来存放顺序表中的元素和元素个数。然后我们定义了一个顺序查找函数 `sequentialSearch`,它的参数包括要查找的顺序表 `L` 和关键字 `key`。函数中,我们将关键字存放在哨兵位置 `L.data[0]`,然后从顺序表的最后一个元素开始向前查找,直到找到关键字或者查找到哨兵位置。最后,函数返回查找结果,即关键字在顺序表中的位置。在主函数中,我们定义了一个顺序表 `L`,并初始化了其中的元素。然后我们调用 `sequentialSearch` 函数来查找关键字 `key=6`,并输出查找结果。 需要注意的是,在将关键字存放在哨兵位置后,我们从顺序表的最后一个元素开始查找,这样当查找到哨兵位置时,循环结束,函数返回查找失败。如果从顺序表的第一个元素开始查找,当查找到哨兵位置时,循环不会结束,会一直死循环下去。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值