顺序查找表

//--search.h
#include
typedef int KeyType;//关键字类型

//数据元素类型
typedef struct{
	KeyType key;
	std::string name;
}ElemType;

//静态查找表结构
typedef struct{
	ElemType * elem;
	int length;
}STable;

//顺序查找返待查找元素的位置
int search_Seq(STable st, KeyType key);


//--search.cpp 顺序查找,返回待查元素的位置

#include"search.h"

int search_Seq(STable st, KeyType key){
	st.elem[0].key = key;   //哨兵
	int i = 0;
	for( i = st.length; key != st.elem[i-1].key; --i);
	return i;
}

//--test.cpp


#include
#include"search.h"

void main(){
	const int ElemNumber = 3;
	ElemType elem[ElemNumber]= {
		{1,"tian"},
		{2,"xin"},
		{3,"world"},
	} ;

	STable sTable;
	sTable.elem = elem;
	sTable.length = ElemNumber;
	for(int i = 0; i < ElemNumber; ++i)
	{
		std::cout<< "请输入第" << i+1 << "个元素的关键字" << std::endl;
		std::cin >> sTable.elem[i].key;
		std::cout<< "请输入第" << i+1 << "个元素的姓名" << std::endl;
		std::cin >> sTable.elem[i].name;
	}

	for(int i = 1; i <= ElemNumber; ++i)
	{
		std::cout<< "第" << i << "个元素的关键字是:"<< sTable.elem[i-1].key<< std::endl;
		std::cout<< "第" << i << "个元素的名字是:"<< sTable.elem[i-1].name<< std::endl;
	}

	int position = search_Seq(sTable, 2);
	std::cout<< "你查找的是第" << position << "个元素:\n" << std::endl;

}

       假设查找表中每个元素被查找的可能性相等,均为 1/n 的时候,顺序查找的平均查找长度为(n+1)/2,即平均每次成功查找到一个元素需要进行(n+1)/2次关键字的比较,这显然是低效的,当n规模很大时,顺序查找的效率将会很低。但是实际应用中,每个元素被查找的可能性肯定是不同的,如果将高频查找元素安排在查找表尾部(从尾部开始查找,当然也可以从头开始查找)那么平均查找长度将会大大减少,所以可以考虑在每一个元素中附设一个访问频度域,并且使顺序表中的元素始终按照访问频度域非递减有序的次序排列,使得查找概率大的元素在查找过程中不断后移,以便在以后的查找中减少比较次数。


你可能感兴趣的:(C++)