查找

来源:互联网 发布:怎么激活电脑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;
  }
 }
}

原创粉丝点击