#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<string.h>
#include<algorithm>
using namespace std;
class dijiuzhang
{
public:
int a[10];
int haxitem[10];
struct Node
{
int data;
Node * rchild;
Node * lchild;
Node(int a):data(a),rchild(NULL),lchild(NULL) {}
Node():rchild(NULL),lchild(NULL) {}
};
Node * head;
Node * cur;
dijiuzhang()
{
Node * head = new Node();
for(int i = 0 ; i < 10 ; i ++)
{
int tem;
while(1)
{
int flag = 0;
tem = rand()%10;
for(int j = 0 ; j < i ; j++)
{
if(tem == a[j])
{
flag = 1;
break;
}
}
if(flag==0)
{
a[i] = tem;
break;
}
}
cout<<a[i]<<" ";
for(int i = 0 ; i < 10 ; i++)
{
haxitem[i] = a[i];
}
}
cout<<endl;
}
void shunxu(int b)//顺序查找
{
cout<<"顺序查找"<<endl;
for(int i = 0 ; i < 10 ; i++)
{
if(a[i] == b)
{
cout<<"Find!"<<endl;
cout<<"i="<<i<<endl;
return;
}
}
cout<<"not find"<<endl;
}
void zheban(int b)//折半查找
{
cout<<"折半查找:"<<endl;
int low,high,mid;
low = 0;
high = 9;
sort(a,a+10);
while(low <= high)
{
mid = (low + high) / 2;
if(a[mid] == b)
{
cout<<"Find!"<<endl;
cout<<"i="<<mid<<endl;
return;
}
else if(a[mid] > b)
{
high = mid - 1;
}
else
{
low = mid + 1;
}
}
cout<<"not find"<<endl;
return;
}
void erchapaixushu()//二叉排序树
{
cout<<"二叉排序树"<<endl;
for(int i = 0 ; i < 10 ; i++)
{
Node * tem = new Node(a[i]);
if(i==0)
{
head = tem;
cur = tem;
continue;
}
while(1)
{
if(cur -> data <= tem -> data && cur -> rchild == NULL)
{
cur -> rchild = tem;
cur = head;
break;
}
else if(cur -> data <= tem -> data)
{
cur = cur -> rchild;
}
if(cur -> data > tem -> data && cur -> lchild == NULL)
{
cur -> lchild = tem;
cur = head;
break;
}
else if(cur -> data > tem -> data)
{
cur = cur -> lchild;
}
}
}
}
void dfs(Node * tem)
{
if(tem)
{
dfs(tem -> lchild);
cout<<tem -> data<<" ";
dfs(tem -> rchild);
}
}
void haxi()//哈希表
{
int tem[10];
int haxibiao[10];
int chongtu[20] = {1,-1,2,-2,3,-3,4,-4,5,-5,6,-6,7,-7,8,-8,9,-9,10,-10};
memset(haxibiao, 0 , sizeof(int)*10);
for(int i = 0 ; i < 10 ; i++)tem[i] = haxitem[i];
for(int j = 0 ; j < 10 ; j ++)
{
int temi = 0;
int temchongtu = 0;
while(1)
{
int z = tem[j]% 7 + temchongtu;
if(haxibiao[tem[j]%7+temchongtu]==0&&z >= 0)
{
haxibiao[tem[j]%7+temchongtu] = tem[j];
if(tem[j] == 0)
{
haxibiao[tem[j]%7+temchongtu] = -1;
}
temchongtu = 0;
temi = 0;
break;
}
else
{
temchongtu = chongtu[temi++];
}
}
}
cout<<endl;
cout<<"建立的哈希表:"<<endl;
for(int i = 0 ; i < 10 ; i++)
{
if(haxibiao[i] == -1)haxibiao[i] = 0;
}
for(int i = 0 ; i < 10 ; i++)
{
cout<<haxibiao[i]<<" ";
}
}
};
int main()
{
dijiuzhang duskcl;
cout<<"请输入要查找的元素"<<endl;
int a;
cin>>a;
duskcl.zheban(a);
duskcl.shunxu(a);
duskcl.erchapaixushu();
duskcl.dfs(duskcl.head);
duskcl.haxi();
}