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