线性表查找

顺序表的顺序查找&&单链表的顺序查找

//顺序表的顺序查找
template<typename T>
bool SeqSearch(T a[], int n, T target) {
	for (int i = 0; i < n; i++)
	{
		if (a[i] == target)
			return true;
	}
	return false;
}

//单链表的顺序查找
template<typename T>
class Node {
public:
	T data;
	Node* next;
};

template<typename T>
bool LinkSeqSearch(Node<T>* head, T target) {
	Node<T>* p = head->next;
	while (p && p->data != target)
		p = p->next;
	if (p != nullptr)
		return true;
	return false;
}

折半查找

折半查找的精髓就是控制区间的缩小,需要注意的是我的递归做法中区间是左闭右闭的,而非递归方法中区间是左闭右开的,需要注意的是折半查找对数组的要求是有序的

//折半查找的递归算法
template<typename T>
void recursive(T a[], int left, int right, T target, bool& flag) {
	if (left > right || flag == true) return;//递归结束条件
	int mid = (left + right) / 2;
	if (target < a[mid])
		recursive(a, left, mid - 1, target, flag);
	else if (target > a[mid])
		recursive(a, mid + 1, right, target, flag);
	else if (target == a[mid])
		flag = true;
}

template<typename T>
bool BinarySearch1(T a[], int n, T target) {
	bool res = false;
	int left = 0, right = n, mid = (left + right) / 2;
	recursive<T>(a, left, right, target, res);
	return res;
}

//折半查找的非递归算法
template<typename T>
bool BinarySearch2(T a[], int n, T target) {
	bool res = false;
	int left = 0, right = n, mid = (left + right) / 2;
	while (left < right)
	{
		if (target < a[mid])
		{
			right = mid;
			mid = (left + right) / 2;
		}
		else if (target > a[mid])
		{
			left = mid + 1;
			mid = (left + right) / 2;
		}
		else if (target == a[mid])
		{
			res = true;
			break;
		}
	}
	return res;
}

全部代码

BasicSearch.h

#pragma once
#ifndef BASICSEARCH_H
#define BASICSEARCH_H
#include<iostream>
using std::cout;
using std::endl;

//顺序表的顺序查找
template<typename T>
bool SeqSearch(T a[], int n, T target) {
	for (int i = 0; i < n; i++)
	{
		if (a[i] == target)
			return true;
	}
	return false;
}

//单链表的顺序查找
template<typename T>
class Node {
public:
	T data;
	Node* next;
};

template<typename T>
bool LinkSeqSearch(Node<T>* head, T target) {
	Node<T>* p = head->next;
	while (p && p->data != target)
		p = p->next;
	if (p != nullptr)
		return true;
	return false;
}

//折半查找的递归算法
template<typename T>
void recursive(T a[], int left, int right, T target, bool& flag) {
	if (left > right || flag == true) return;//递归结束条件
	int mid = (left + right) / 2;
	if (target < a[mid])
		recursive(a, left, mid - 1, target, flag);
	else if (target > a[mid])
		recursive(a, mid + 1, right, target, flag);
	else if (target == a[mid])
		flag = true;
}

template<typename T>
bool BinarySearch1(T a[], int n, T target) {
	bool res = false;
	int left = 0, right = n, mid = (left + right) / 2;
	recursive<T>(a, left, right, target, res);
	return res;
}

//折半查找的非递归算法
template<typename T>
bool BinarySearch2(T a[], int n, T target) {
	bool res = false;
	int left = 0, right = n, mid = (left + right) / 2;
	while (left < right)
	{
		if (target < a[mid])
		{
			right = mid;
			mid = (left + right) / 2;
		}
		else if (target > a[mid])
		{
			left = mid + 1;
			mid = (left + right) / 2;
		}
		else if (target == a[mid])
		{
			res = true;
			break;
		}
	}
	return res;
}

#endif // !BASICSEARCH_H

SearchHelper.h

#pragma once
#ifndef SEARCHHELPER_H
#define SEARCHHELPER_H

#include<iostream>
#include<ctime>
#include<cassert>
using namespace std;

namespace SortTestHelper {
	//生成n个元素的随机数组
	int* generateRandomArray(int n, int rangeL, int rangeR) {
		assert(rangeL < rangeR);
		int* arr = new int[n];
		srand(time(NULL));//生成随机种子
		for (int i = 0; i < n; i++)
			arr[i] = rand() % (rangeR - rangeL + 1) + rangeL;//rand()返回的是一个随机数		
		return arr;
	}

	template<typename T>
	void testSearch(string searchName, bool(*search)(T[], int, T), T arr[], int n, T target) {//测试不同查找所耗的时间
		clock_t start_time = clock();
		search(arr, n, target);
		clock_t end_time = clock();
		cout << searchName << ":" << double(end_time - start_time) / CLOCKS_PER_SEC << endl;
	}
}


#endif // !SEARCHHELPER_H

main.cpp

#include"BasicSearch.h"
#include"SearchHelper.h"


int main() 
{
	int* a = SortTestHelper::generateRandomArray(1000001, 1, 1000001);
	a[1000000] = 1000022;
	SortTestHelper::testSearch<int>("SeqSearch", SeqSearch<int>, a, 1000001,1000222);
	int b[] = { 1,2,4,6,7,8,9,10,23,32,35,37,38,45,48,50,60,70,112,234,565,4552 };
	int n = sizeof(b) / sizeof(int);
	cout << BinarySearch1<int>(b, n, 0) << endl;
	cout << BinarySearch2<int>(b, n, 0) << endl;
	delete []a;
	return 1;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值