查找算法

一 . 静态查找表

1. 顺序查找

     算法思想:从表中第一个记录开始,逐个进行记录的关键字和给定值进行比较,若某个记录的关键字和给定值比较相等,则查找成功;反之,若直至最后一个记录,其关键字和给定的值都不想等,则表明表中没有所查找的记录,查找失败。

     性能:平均查找长度ASL=(n+1)/2

2. 二分查找(折半查找) --------前提必须是有序表,性能只有在均匀分布的时候才是最优的。

     算法思想:先确定待查记录所在的范围,然后逐步缩小范围直到找到或者没有找到记录为止。     

int bin_search(elemtype s[], keytype k, int n)
{
	int low, mid, high;
	low = 0;
	high = n - 1;
	while (low <= high)
	{
		mid = (low + high) / 2;
		if (s[mid].key == k)
		{
			return mid;       //搜索成功
		} 
		else if (s[mid].key < k)
		{
			low = mid + 1;
		}
		else
		{
			high = mid - 1;
		}
	}       //end while
	return -1;   //搜索不成功

}

    该查找算法适用于有序数组,对于无序数组可以先排序在用此算法。

     分析:设待查元素所在区域的下界为low, 上界为high,则中间位置为mid=(low+high)/2.

                 若此元素关键字值等于给定值k,则查找成功;

                 若此元素关键字值小于给定值,则在区间mid+1~high内进行二分查找;

                 若此元素关键字值大于给定值,则在区间low~mid-1内进行二分查找;

    性能:二分查找的效率比顺序查找高,ASL=log2(n+1)-1

二. 哈希查找

      哈希查找是通过计算数据元素的存储地址进行查找的一种方 法。

   哈希查找的操作步骤:
    ⑴用给定的哈希函数构造哈希表;
    ⑵根据选择的冲突处理方法解决地址冲突;
    ⑶在哈希表的基础上执行哈希查找。

//根据关键字和哈希函数,建立哈希表,基于线性探测再散列解决冲突方法
void BuildHashTable(int * pKeyArry, int * pHashTable, int len)
{
	int * pKey = pKeyArry;
	int * pHash = pHashTable;
	bool *pFlag = new bool[len];   //标识哈希地址是否已占用
	memset(pFlag, false, len);

	int imod;
	while (pKey != (pKeyArry + len))
	{
		imod = *pKey % len;
		while (true)
		{
			if (false == pFlag[imod])
			{
				pHash[imod] = *pKey;
				pFlag[imod] = true;
				break;
			}
			else
			{
				++imod;
				imod %= len;
			}
		}
		++pKey;
	}
   delete [] pFlag;
}

//哈希查找
bool HashSearch(int * pHashTable, int iKey, int len)
{
	int *pHash = pHashTable;
	int addr = iKey % len;
	for (int i = 0; i < len; i++)
	{
		if (pHash[addr] == iKey)
		{
			return true;
		}
		else
		{
			++addr;
			addr %= len;
		}
	}
	return false;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值