数据结构---线性表的查找技术(顺序查找、二分查找递归与非递归)

线性表的查找技术

在线性表中进行查找通常属于静态查找,这种查找算法简单,主要适用于小型查找集合。

LineSearch.h

#pragma once
#include <iostream>

using namespace std;

const int MaxSize = 100;

class LineSearch
{
public:
	LineSearch(int a[], int n);//构造函数
	~LineSearch(){}//析构函数为空
	int SeqSearch(int k);//顺序查找
	int BinSearch1(int k);//二分查找 非递归
	int BinSearch2(int low, int high, int k);//二分查找 递归法

private:
	int data[MaxSize];//查找集合为整型
	int length;//查找集合的元素个数
};

LineSearch::LineSearch(int a[], int n)
{
	length = n;
	for (int i = 0; i < length; i++)
	{
		data[i+1] = a[i];
	}
}

int LineSearch::SeqSearch(int k)
{
	data[0] = k;
	int i = length;
	while (data[i] != k)
	{
		i--;
	}
	return i;
}

int LineSearch::BinSearch1(int k)
{
	int low = 1, high = length, middle;
	while (low <= high)
	{
		middle = (low + high) / 2;
		if (data[middle] > k)
		{
			high = middle - 1;
		}
		else if (data[middle] < k)
		{
			low = middle + 1;
		}
		else
		{
			return middle;
		}
	}
	return 0;
}

int LineSearch::BinSearch2(int low, int high, int k)
{
	if (low > high)
	{
		return 0;
	}
	else 
	{
		int mid = (low + high) / 2;
		if (data[mid] > k)
		{
			return BinSearch2(low, mid - 1, k);
		}
		else if (data[mid] < k)
		{
			return BinSearch2(mid + 1, high, k);
		}
		else
		{
			return mid;
		}
	}
}

算法改进:设置哨兵。哨兵就是待查值,存放在查找方向的尽头处,在查找过程中每次比较后,不用判断查找位置是否越界,从而提高查找速度。实践证明,这个改进在表长大于1000时,进行一次顺序查找的平均时间几乎减少一半。

LineSearch.cpp

#include "LineSearch.h"

int main()
{
	int arr1[10] = { 9,8,7,6,5,4,3,2,1,10 };
	int arr2[10] = { 1,2,3,4,5,6,7,8,9,10 };

	LineSearch L1{ arr1, 10 }, L2{ arr2, 10 };
	int select, key, index = 0;

	cout << "***---选择想使用的查找算法---***" << endl
		<< "1.顺序查找" << endl
		<< "2.二分查找 非递归" << endl
		<< "3.二分查找 递归法" << endl
		<< "请输入序号:";
	cin >> select;
	cout << "请输入要查找的值:";
	cin >> key;

	switch (select)
	{
	case 1:
		index = L1.SeqSearch(key);
		break;
	case 2:
		index = L2.BinSearch1(key);
		break;
	case 3:
		index = L2.BinSearch2(1, 10, key);
		break;
	default:
		cout << "输入有误" << endl;
		system("pause");
		break;
	}

	cout << "位置为:" << index << endl;

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值