C++ 二分查找 哈希查找 数据结构

一.   二分查找

首先我们了解一下二分查找的思想

条件:

在一个有序数组中 

首先设置标记begin和end

分别记录数组的首元素和最后元素的下标

标记mid为中间值  mid的左边的元素都小于mid  mid右边的元素都大于mid

判断我们要找的值Target和arr[mid]相比 

1:等于 直接返回下标mid

2.小于: 在mid的左边继续寻找  end被赋予mid-1;  mid重新变成(end + begin) / 2;  成为新的中间值

继续循环

3.大于: 在mid的右边继续寻找  begin被赋予mid+1;  mid重新变成(end + begin) / 2;  成为新的中间值

继续循环

知道begin>end  所有元素都找完了  还没找到  返回-1;  

if (target == arr[mid])
		{
			return mid;
		}
		else if (target < arr[mid])
		{
			end = mid - 1;
			mid = (end + begin) / 2;
		}
		else if (target > arr[mid])
		{
			begin = mid + 1;
			mid = (end + begin) / 2;

		}

二分查找完整代码如下

#include
using namespace std;
int BinarySerch(int arr[],int nLen,int target)
{
	if (arr == NULL || nLen <= 1)
		return -1;

	int begin = 0;
	int end = nLen-1;
	int mid = (end + begin) / 2;
	while (begin <= end)
	{
		if (target == arr[mid])
		{
			return mid;
		}
		else if (target < arr[mid])
		{
			end = mid - 1;
			mid = (end + begin) / 2;
		}
		else if (target > arr[mid])
		{
			begin = mid + 1;
			mid = (end + begin) / 2;

		}
	}

	return -1;
}
int main()
{
	int arr[10] = {1,2,3,4,5,6,7,8,9 };
	
	cout<

二.   哈希查找

在编写哈希查找之前  我们先来了解哈希表

哈希表会把所得到的元素分类   每一个种类的数据们构成一个元素  一个元素可以包含多个数据

例如

C++ 二分查找 哈希查找 数据结构_第1张图片

余数相同的数被存放在一个元素中 

怎么实现多个数据存放在一个元素中呢?

这里我们用到了链式存储法:

可以视为哈希数组中每一个元素都是一个链表的头   这些链表共同组成了哈希数组

哈希数组是一个指针数组

首先定义哈希表结构体

struct Hash
{
	int nIndex;//元素下标
	int niD;//元素得值
	Hash* pNext;//元素的下一个
};

这里我们实现了一个函数用来将元素放入哈希表  然后返回该哈希表

Hash** CreatHashTable(int arr[], int nLen)
{
	if (arr == NULL || nLen <= 1)
	{
		return nullptr;
	}

	Hash** HashArr = new Hash * [nLen];//创建一个哈希数组
	::memset(HashArr, 0, sizeof(Hash*)*nLen);//每一项都赋值为0
	for (int i = 0; i < nLen; i++)
	{
        判断当前arr[i]元素在HashArr数组中的下表为几
		int nKey = arr[i] % nLen;
        //创建新节点
		Hash* pTemp = new Hash;
		pTemp->niD = arr[i];
		pTemp->nIndex = i;
		pTemp->pNext = NULL;

        //往当前元素的链表上放
		if (HashArr[nKey] == 0)
		{
			HashArr[nKey] = pTemp;
		}
		else
		{
			pTemp->pNext = HashArr[nKey];
			
			HashArr[nKey] =pTemp ;

		}
		
		
		 

	}
	return HashArr;
}

然后开始编写我们的哈希查找

int HashSerch(Hash**HashArr,int nLen,int Value)
{
    //将哈希数组传进来 

    //参数校验
	if (HashArr == NULL || nLen <= 1)
	{
		return -1;
	}

    //判断要找的Value在哪个下标的元素中
	int mark = Value % nLen;

	for (int i = 0; i < nLen; i ++ )
	{
		if (i == mark)
		{
			Hash* pMark= HashArr[i];
            //定义标记用来遍历链表
			while (pMark)
			{
				if (pMark->niD == Value)
				{
                   //找到了  返回下标
					return pMark->nIndex;
				}
				pMark = pMark->pNext;
			}
		}
		
	}
//遍历结束 没找到
	return -1;

}

哈希查找完整代码如下

#include
using namespace std;
struct Hash
{
	int nIndex;
	int niD;
	Hash* pNext;
};
Hash** CreatHashTable(int arr[], int nLen)
{
	if (arr == NULL || nLen <= 1)
	{
		return nullptr;
	}

	Hash** HashArr = new Hash * [nLen];
	::memset(HashArr, 0, sizeof(Hash*)*nLen);
	for (int i = 0; i < nLen; i++)
	{
		int nKey = arr[i] % nLen;
		Hash* pTemp = new Hash;
		pTemp->niD = arr[i];
		pTemp->nIndex = i;
		pTemp->pNext = NULL;
		if (HashArr[nKey] == 0)
		{
			HashArr[nKey] = pTemp;
		}
		else
		{
			pTemp->pNext = HashArr[nKey];
			
			HashArr[nKey] =pTemp ;

		}
		
		
		 

	}
	return HashArr;
}

int HashSerch(Hash**HashArr,int nLen,int Value)
{
	if (HashArr == NULL || nLen <= 1)
	{
		return -1;
	}
	int mark = Value % nLen;

	for (int i = 0; i < nLen; i ++ )
	{
		if (i == mark)
		{
			Hash* pMark= HashArr[i];
			while (pMark)
			{
				if (pMark->niD == Value)
				{
					return pMark->nIndex;
				}
				pMark = pMark->pNext;
			}
		}
		
	}
	return -1;

}
int main()
{
	int arr[10] = { 0,10,2,30,4,5,6,1024,8,9 };
	Hash** pArr = CreatHashTable(arr, 10);
	cout<

你可能感兴趣的:(c++,数据结构,哈希算法)