查找
来源:互联网 发布:怎么激活电脑windows 编辑:程序博客网 时间:2024/04/30 08:09
#include <iostream>
#include <assert.h>
using namespace std;
template<class T> class CSearch
{
private :
CSearch(){} // 必须定义, 且为private.
CSearch(const CSearch&); // 不实现.
CSearch& operator=(const CSearch&); // 不实现.
~CSearch(){} // 可声明为public, 但这里声明为private没有错, 可被调用.
public :
static CSearch& GetInstance()
{
static CSearch theSingleton;
return theSingleton;
}
public :
//从表的一端开始,顺序扫描线性表,依次将扫描到的结点关键宇和给定值K相比较。
//若当前扫描到的结点关键字与K相等,则查找成功;若扫描结束后,仍未找到关键字等于K的结点,则查找失败。
//效率:最大查找长度和平均查找长度的数量级 ( 即算法的时间复杂度 ) 均为 O(n) 。
//优点:算法简单,且对表的结构无任何要求,无论是用向量还是用链表来存放结点,也无论结点之间是否按关键字有序,它都同样适用。
//缺点:查找效率低,因此,当n较大时不宜采用顺序查找。
void Search_Sequence(T dataset[], int n, T data);
//将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,
//如果要找的元素值小于该中点元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。
//折半查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。
//但是,折半查找的先决条件是查找表中的数据元素必须有序。
//效率:O(log2 n ),半查找的平均查找长度数量级 ( 算法时间复杂度 ) 亦为 O (log2 n ) 。
//缺点:分查找需要将表按关键字排序。而排序本身是一种很费时的运算。既使采用高效率的排序方法也要花费O(nlgn)的时间。
//使用环境:二分查找只适用顺序存储结构。为保持表的有序性,在顺序结构里插入和删除都必须移动大量的结点。
//因此,二分查找特别适用于那种一经建立就很少改动、而又经常需要查找的线性表。
void Search_Binary_Unrecursion(T dataset[], int low, int high, T data);
void Search_Binary_Recursion(T dataset[], int low, int high, T data);
//索引查找是在索引表和主表(即线性表的索引存储结构)上进行的查找。
//索引查找的过程是:首先根据给定的索引值K1,在索引表上查找出索引值等于KI的索引项,
//以确定对应予表在主表中的开始位置和长度,然后再根据给定的关键字K2,茬对应的子表中查找出关键字等于K2的元素(结点)。
//对索引表或子表进行查找时,若表是顺序存储的有序表,则既可进行顺序查找,也可进行二分查找,否则只能进行顺序查找。
//即通过索引可以定位到相应的数据块,然后在该数据块查找该数据,
//如果块中数据是有序的,这可以顺序查找或二分查找,如果是无序的,则只能顺序查找
void Search_Index(T dataset[], int n, T data);
};
template<class T> void CSearch<T>::Search_Sequence(T dataset[], int n, T data)
{
assert(dataset!=NULL,"In Search_Sequence ,data is NULL/n");
for (int index=0; index<n; index++)
{
if (dataset[index] == data)
{
cout<<index<<endl;
return;
}
}
}
template<class T> void CSearch<T>::Search_Binary_Unrecursion(T dataset[], int low, int high, T data)
{
assert(dataset!=NULL,"In Search_Binary_Unrecursion ,data is NULL/n");
assert(high>low,"In Sort_Insert ,low>high/n");
int mid = 0;
while(high >= low)
{
mid = (low + high)/2;
if (data > dataset[mid])
{
low = mid+1;
}
else if (data < dataset[mid])
{
high = mid-1;
}
else
{
cout<<mid<<endl;
return;
}
}
}
template<class T> void CSearch<T>::Search_Binary_Recursion(T dataset[], int low, int high, T data)
{
assert(dataset!=NULL,"In Search_Binary_Recursion ,data is NULL/n");
if (low <= high)
{
int mid = (low+high)/2;
if (data > dataset[mid])
{
Search_Binary_Recursion(dataset, mid+1, high, data);
}
else if (data < dataset[mid])
{
Search_Binary_Recursion(dataset, low, mid-1, data);
}
else
{
cout<<mid<<endl;
return;
}
}
}
- 查找
- 查找
- 查找
- 查找
- 查找
- 查找
- 查找
- 查找
- 查找
- 查找
- 查找
- 查找
- 查找
- 查找
- 查找
- 查找
- 查找
- 查找
- 以后
- 《Linux那些事儿之我是USB》我是U盘(6)未曾开始却似结束
- 排列组合
- Unsupported major.minor version 49.0的错误(JDK 编译与运行 版本不匹配)
- 密码学常用网址
- 查找
- C 指针变量 也是 传值 调用
- Android 建立Menu选单&&onOptionsItemSelected
- 常见网站漏洞及解决办法
- 关于《现代密码学》教材与教学改革的几点思考
- QTP中发送邮件
- 面试官问题的回答
- FCKeditor在asp.net中的用法
- 比较SQL Server 2005与SQL Server 2000分页技巧