三大查找算法总结:二分查找,分块查找和哈希表查找。

 
 

终于下定决心把查找和排序好好整一整,今天就弄了一个对分查找,也成为对半查找。原理十分简单,话不多说,直接上源代码。未完待续,持续更新中。。。

1、对半查找,要求输入有序序列。

// sort.cpp : 定义控制台应用程序的入口点。
//



//--------------------------请注意对半查找要求输入序列为有序----------------------------//
#include "stdafx.h"
#include <iostream>

using namespace std;

void find_mid(int* p,int n,int low,int high)
{
	int l=low;
	int h=high;
	int mid=(l+h)/2;

	if (l<=h)
	{
		if (*(p+mid)==n)
		{
			cout<<"Found,location is"<<" "<<mid+1<<endl;
		}
		else if (*(p+mid)<n)
		{
			//l=mid+1;
			find_mid(p,n,l+1,h);
		}
		else
		{
			//h=mid-1;
			find_mid(p,n,l,h-1);
		}
	}
	if (l>h)
	{
		cout<<"The number you want does not exist"<<endl;
	}

}

int _tmain(int argc, _TCHAR* argv[])
{
	int len;
	int *a;
	int num;
	cout<<"Please input the array length:"<<endl;
	cin>>len;
	a = (int*) malloc(len*sizeof(int));
	cout<<"Please Input the numbers:"<<endl;
	for (int i = 0; i < len; i++)
	{
		cin>>a[i];
	}
	cout<<"please input the number you want to search:"<<endl;
	cin>>num;
	find_mid(a,num,0,len-1);
	return 0;
}

 2.分块查找

分块查找的原理可见http://student.zjzk.cn/course_ware/data_structure/web/chazhao/chazhao9.2.3.htm

直接附上代码

#include "stdafx.h"
#include <iostream>

using namespace std;
typedef struct index
{
	int pos;
	int key;
}idex;
idex* findMaxLoc(int* p,int n,idex* id)
{
	int max=*p;
	int i=0,t=0;
	for(i=1;i<n;i++)
	{
		if(*(p+i)>max)
		{
			max=*(p+i);
			t=i;
		}
	}

	id->pos=t;
	id->key=max;
	return id;
}
int findParts(int* p,int n,int low,int high,int s)
 {
	int l=low;
	int h=high;
	int mid=(l+h)/2;
	static int cnt;
	if (l<=h)
	{
		if (*(p+mid)==n)
		{
			cout<<"Found,location is"<<" "<<mid+1<<endl;
		}
		else if (*(p+mid)>n)
		{
			
			findParts(p,n,l,mid-s,s);
		}
		else
		{
			findParts(p,n,mid+s,h,s);		
		}
	}
	if (l>h)
	{
		cnt=(h+s)/s;
		cout<<"the number you are looking for is at "<<cnt<<" parts"<<endl;
	}
	return cnt;
}
void block_search(int* p,int n,int num)
{
	int b=3;                     //分成3块
	int s=n/b;                   //每块有s个元素
	int j;
	idex* id;
	id=(idex*) malloc(3*sizeof(idex)); 
	for(int i=0;i<b;i++)
	{
		findMaxLoc(p+i*s,s,(id+i));
		(id+i)->pos+=i*s;
		cout<<"pos is"<<(id+i)->pos<<" max is"<<(id+i)->key<<endl;
	}

	j=findParts(p,num,s-1,s*b-1,s);
	for (int i = j*s; i < (j+1)*s; i++)
	{
		if (*(p+i)==num)
		{
			cout<<"found, pos is "<<i+1<<endl;
			break;
		}
		else
		{
			continue;
		}
	}
}

int _tmain(int argc, _TCHAR* argv[])
{
	int len;
	int *a;
	int num;
	cout<<"Please input the array length:"<<endl;
	cin>>len;
	a = (int*) malloc(len*sizeof(int));
	cout<<"Please Input the numbers:"<<endl;
	cout<<"tips:for block searching, the numbers are devided into 3 parts and this depends to you"<<endl;
	for (int i = 0; i < len; i++)
	{
		cin>>a[i];
	}
	cout<<"please input the number you want to search:"<<endl;
	cin>>num;
	/*find_mid(a,num,0,len-1);*/
	block_search(a,len,num);
	return 0;
}

分块查找的性能介于顺序查找和对半查找之间。

 

3. 哈希表查找

hash查找的原理随便百度就知道了,下面直接给出源码,欢迎您的批评与指正。

// find.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>

using namespace std;

typedef struct HashTabel
{
	int *number;      //元素的值
	int length;     //指HASH表的表长
}hashtabel;

void InitHash(hashtabel *h,int l)
{
	h->length=l;
	h->number=(int*) malloc(l*sizeof(int));
	for (int i = 0; i < l; i++)
	{
		*(h->number+i)=0;
	}
}

int hash_key(int *p,int n)
{
	int key;
	key=*p%n;
	return key;
}

int prime(int n)
{
	int i;                //i为不大于一个数的最大质数
	int j;
	int k;
	for (i = n; i > 1; i--)
	{
		k=i/2;
		for (j = 2; j <= k; j++)
		{
			if (i%j==0)
			{
				break;
			}
		}
		if (j==k+1)
		{
			return i;
			break;
		}
	}
	
}

void insert(hashtabel *h,int *p,int index)
{
	h->number[index]=*p;
}

void search_elem(hashtabel *h,int *p,int *n,int index)           //说明:p为hash表中指向下一个数的指针,*n为要插入的数值,index为下表
{
	if (*p==0)
	{
		insert(h,n,index);
	}
	else
	{
		if (*p==*n)
		{
			cout<<"Found, position is "<<index<<endl;
		}
		else
		{
			search_elem(h,p+1,n,index+1);
		}
		
	}
}
void search(hashtabel *h,int *p)
{
	int max=h->length;
	int k;
	int key;
	int index;
	k=prime(max);	
	key=hash_key(p,k);
	index=key;
	if (h->number[key]==0)          //这个位置为空就进行插入
	{
		insert(h,p,key);
	}
	else
	{
		if (h->number[key]==*p)
		{
			cout<<"Found,position is "<<key<<endl;
		}
		else
		{
			index=(index+1)%6;
			search_elem(h,h->number+key+1,p,index);                            //不为空时则采用二次探测再散列法
		}
		
	}
}


int _tmain(int argc, _TCHAR* argv[])
{
	int len;  
	int *a;  
	int num;  
	hashtabel H;
	cout<<"Please input the array length:"<<endl;  
	cin>>len;  
	a = (int*) malloc(len*sizeof(int));  
	cout<<"Please Input the numbers:"<<endl;  
	InitHash(&H,len);
	for (int i = 0; i < len; i++)  
	{  
		cin>>a[i];  
		search(&H,&a[i]);
	}  
	return 0;
}

 

 

 

    原文作者:查找算法
    原文地址: https://blog.csdn.net/xiaxia__/article/details/9152755
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞