几种查找算法

   1.顺序查找
       依次比较结构中的每个元素,这种查找方式最直接,也是最简单的了。
  2.二分查找(折半查找)
      简单的说就是每次比较的时候都和中间的元素进行比较!如下图:
        
  代码:
        

int BinarySearch(int a[],int dat,int len)
{
	int start=0,end=len-1,mid;

	while(start<=end)
	{
		mid=(start+end)/2;
		if(a[mid]==dat)
			return start;
		else if(dat < a[mid])
			end=mid-1;
		else 
			start=mid+1;
	}
	return -1;
}
  3.二叉排序树查找
     这种方式的查找首先需要创建二叉排序树,然后与元素进行比较
     特点是:  对于根节点,左边的数据总是比右边的数据要小,根节点排在中间即: 右>中>左,对于每一颗树 都是遵循相同的这种规则;创建代码如下: 
    
void InsertBSTree(pBSTree t,int key)
{
	pBSTree pT,parent,head;

	if(!(pT=(pBSTree)malloc(sizeof(BSTree))))
	{
		printf("内存分配失败!\n");
		exit(-1);
	}
        pT->dat=key;
	pT->left=pT->right=NULL;
	head=t;

	while(head)
	{
           parent=head;
	   if(key < head->dat)
		   head=head->left;
	   else
		   head=head->right;
	 }

	if(key < parent->dat)
		parent->left=pT;
	else
		parent->right=pT;
}

void CreateBSTree(pBSTree p,int a[],int n)
{
	int i;
	p->dat=a[0];
	p->left=p->right=NULL;
	for(i=1; i<n; i++)
		InsertBSTree(p,a[i]);
}
 其查找代码更简单了,递归就可以了:
   如下:
pBSTree SearchData(pBSTree p,int dat)
{
	   if(!p || dat == p->dat)
		   return p;
	   else if(dat < p->dat)
		   return SearchData(p->left,dat);
	   else 
		  return SearchData(p->right,dat);
}
    4.索引查找和散列表(应该也叫Hash哈希查找)
     这两种方式的查找都一个共同的特点就是,找到数据中关键字key之间的关系,然后以某一函数的方式,对关键字key进行处理,当查找的时候也按照关键字的函数关系查找。当然,哈希查找还有数据存储冲突的问题,需要采用一定的方法去避免这种冲突。这两种方式都绕了点弯,不过整体上还是比较好啊理解的!
     索引查找:这里函数的关系是除以100的方式先得到索引表中的相关项,再在主表中根据索引表查找...
int IndexSearch(int key)
{
	int i,index,start,length;
	index=key/100;
	for(i=0;i<INDEXTABLE_LEN;i++)
	{
		if(indextable[i].index==index)
		{
			start=indextable[i].start;
			length=indextable[i].length;
			break;
		}
	}
	if(i>=INDEXTABLE_LEN)
		return -1;
	for(i=start; i<start+length; i++)
		if(stu[i]==key)
			return i;
		return -1;
}

//hash search  散列表查找
void InsertHash(int hash[],int m,int data)
{
	int i;
	i=data%13;
	while(hash[i])
		i=(++i)%13;
	hash[i]=data;
}

void CreateHash(int hash[],int m,int data[],int n)
{
	int i;
	for(i=0; i<n; i++)
		InsertHash(hash,m,data[i]);
}

int HashSearch(int hash[],int m,int key)
{
	int i;
	i=key%13;
	while(hash[i] && hash[i]!=key)
		i=(++i)%m;
	if(hash[i]==0)
		return -1;
	else
		return i;
}

  hash的意思就是无序的,混乱的,所以散列表的查找没有一定的规律,但是查找的时候还是从当前查找元素应该在的结构中的数据依次查找!
  数据结构与算法的基本部分大概就这些了,有时候感觉很多东西,你看起来,理解起来,so easy!但是用起来可能就会有问题,而且又很容易忘记,所以我觉得重要的还是后期的具体运用,在实践中熟悉,熟练运用才是硬道理!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值