4.查找:
(1)静态查找
DS静态查找之顺序查找
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
int *elem;
cin >> n;
elem=new int[n+1];
int i;
for(i=1; i<=n; i++)
{
int num;
cin >> num;
elem[i]=num;
}
int t;
cin >> t;
while(t--)
{
int key;
cin >> key;
elem[0]=key;
for(i=n; i>=0; i--)
if(elem[i]==key)
break;
if(i==0)
{
cout<<"error"<<endl;
}
if(i!=0)
{
cout<<i<<endl;
}
}
}
DS静态查找之折半查找
#include<bits/stdc++.h>
using namespace std;
int search_bin(int *e,int k,int l,int h)
{
if(l>h)
return (0);
else
{
int mid=(h+l)/2;
if(k==e[mid])
return mid;
else
{
if(k<e[mid])
return search_bin(e,k,l,mid-1);
if(k>e[mid])
return search_bin(e,k,mid+1,h);
}
}
}
int main()
{
int n;
int *elem;
cin >> n;
elem=new int[n+1];
int i;
for(i=1; i<=n; i++)
{
int num;
cin >> num;
elem[i]=num;
}
int t;
cin >> t;
while(t--)
{
int key;
cin >> key;
int low=1;
int high=n;
if(search_bin(elem,key,low,high)==0)
cout<<"error"<<endl;
if(search_bin(elem,key,low,high)!=0)
cout<<search_bin(elem,key,low,high)<<endl;
}
}
DS静态查找之顺序索引查找
#include<bits/stdc++.h>
using namespace std;
struct nodee
{
int maxn;
int point;
};
nodee s[10];
int find(int num,int &cn,int *e,int k)
{
int i=1;
int j;
for (; i <= num; i++)
{
cn++;
if (k<= s[i].maxn)
for (j = s[i].point; j <= num&&e[j] <= s[i].maxn; j++)
{
cn++;
if (e[j] == k)
return j;
}
}
return 0;
}
void cs(int num,int kum,int *e)
{
int i;
int j;
s[1].point= 1;
for (i = 2; i <= kum; i++)
{
for (j=1; j <= num; j++)
{
if (e[j] > s[i - 1].maxn)
{
s[i].point = j;
break;
}
}
}
}
int main()
{
int *elem;
int n;
cin >> n;
int i;
elem=new int[n+1];
for (i = 1; i <= n; i++)
{
int num;
cin >>num;
elem[i]=num;
}
int ke;
cin >> ke;
for (i = 1; i <= ke; i++)
cin >> s[i].maxn;
cs(n,ke,elem);
int t;
cin >> t;
while (t--)
{
int key;
cin >>key;
int cnt ;
cnt = 0;
int nn;
nn= find(n,cnt,elem,key);
if (nn==0)
cout << "error" << endl;
else
cout << nn << "-" << cnt << endl;
}
}
DS查找——折半查找求平方根
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
double num;
cin>>num;
double low;
double high;
low=0;
high=num;
double m;
double res;
while(high>low)
{
m=1.000*(low+high)/2;
if(m*m-num>-0.00001&&m*m-num<0.00001)
{
res=m;
break;
}
else if(m*m>=num)
high=m;
else
low=m;
}
cout<<fixed<<setprecision(3)<<res<<endl;
}
}
两个有序序列的中位数
#include<bits/stdc++.h>
using namespace std;
int main()
{
int *a;
int *b;
int num;
cin>>num;
a=new int[num];
b=new int[num];
int i;
for(i=0; i<num; i++)
cin>>a[i];
for(i=0; i<num; i++)
cin>>b[i];
int c[2*num];
for(i=0; i<2*num; i++)
{
if(i>=num)
c[i]=b[i-num];
else
c[i]=a[i];
}
for(i=0; i<2*num-1; i++)
{
int j;
int flag;
for(j=0; j<2*num-i; j++)
{
if(c[j]>c[j+1])
{
flag=c[j];
c[j]=c[j+1];
c[j+1]=flag;
}
}
}
cout<<c[(2*num-1)/2];
}
链表的有序构建和查找
#include<bits/stdc++.h>
using namespace std;
#define P 612
struct jie
{
int v;
jie *nex=NULL;
};
int main()
{
int num;
cin>>num;
int mum;
jie *mylist=new jie;
int tran;
tran=0;
int i;
int as;
for(i=0; i<num; i++)
{
jie *now=mylist;
jie* ch=new jie;
cin>>as;
ch->v=as;
while(9)
{
if(now->nex==NULL)
{
now->nex=ch;
break;
}
if(now->nex->v>as)
{
ch->nex=now->nex;
tran=tran+1;
now->nex=ch;
break;
}
now=now->nex;
}
}
cout<<"非空指针变化"<<tran<<"次"<<endl;
mylist=mylist->nex;
cout<<mylist->v;
jie *nod=mylist->nex;
int ac[P];
int pos;
pos=2;
ac[1]=mylist->v;
while(nod!=NULL)
{
cout<<" "<<nod->v;
ac[pos++]=nod->v;
nod=nod->nex;
}
cout<<endl;
cin>>mum;
for(i=0; i<mum; i++)
{
int y;
cin >> y;
if(y>num||y<1)
{
cout<<"error"<<endl;
continue;
}
cout<<ac[y]<<endl;
}
}
(2)动态查找:
DS二叉排序树之创建和插入
#include<bits/stdc++.h>
using namespace std;
#define P 612
struct jie
{
int v;
jie *nex=NULL;
};
int main()
{
int num;
cin>>num;
int mum;
jie *mylist=new jie;
int tran;
tran=0;
int i;
int as;
for(i=0; i<num; i++)
{
jie *now=mylist;
jie* ch=new jie;
cin>>as;
ch->v=as;
while(9)
{
if(now->nex==NULL)
{
now->nex=ch;
break;
}
if(now->nex->v>as)
{
ch->nex=now->nex;
tran=tran+1;
now->nex=ch;
break;
}
now=now->nex;
}
}
cout<<"非空指针变化"<<tran<<"次"<<endl;
mylist=mylist->nex;
cout<<mylist->v;
jie *nod=mylist->nex;
int ac[P];
int pos;
pos=2;
ac[1]=mylist->v;
while(nod!=NULL)
{
cout<<" "<<nod->v;
ac[pos++]=nod->v;
nod=nod->nex;
}
cout<<endl;
cin>>mum;
for(i=0; i<mum; i++)
{
int y;
cin >> y;
if(y>num||y<1)
{
cout<<"error"<<endl;
continue;
}
cout<<ac[y]<<endl;
}
}
DS二叉排序树之查找
#include<bits/stdc++.h>
using namespace std;
class node
{
private:
int data;
node *lchild;
node *rchild;
public:
node(int num)
{
data = num;
lchild = NULL;
rchild = NULL;
}
friend class tree;
};
class tree
{
private:
node *root;
void mid(node *op)
{
if (op)
{
mid(op->lchild);
cout << op->data << " ";
mid(op->rchild);
}
}
public:
tree()
{
root=NULL;
}
void order()
{
mid(root);
cout<<endl;
}
void establish(int ns);
int f2(int y,node *ro)
{
if(ro->lchild==NULL&&ro->data>y)
return -45786;
if(ro->data<y&&ro->rchild==NULL)
return -45786;
if(ro->data==y)
return 1;
if(ro->data<y)
return 1+f2(y,ro->rchild);
if(ro->data>y)
return 1+f2(y,ro->lchild);
}
void f1(int t)
{
while(t--)
{
int key;
cin>>key;
int numm;
numm=f2(key,root);
if(numm>=0)
cout<<numm<<endl;
else
cout<<"-1"<<endl;
}
}
};
void tree::establish(int ns)
{
node *temp = new node(ns);
if (root == NULL)
{
root = temp;
}
else
{
node *m=root;
node *n=NULL;
while (1)
{
if (m == NULL)
{
if (ns < n->data)
{
n->lchild = temp;
}
else if (ns > n->data)
{
n->rchild = temp;
}
break;
}
if (ns > m->data)
{
n =m;
m = m->rchild;
}
else if (ns < m->data)
{
n = m;
m =m->lchild;
}
}
}
}
int main()
{
int num;
int mum;
cin >> num;
tree mytree;
int i;
for (i = 0; i < num; i++)
{
int key;
cin >> key;
mytree.establish(key);
}
mytree.order();
cin >> mum;
mytree.f1(mum);
}
DS二叉排序树之删除
#include<bits/stdc++.h>
using namespace std;
class node
{
private:
int data;
node *lchild;
node *rchild;
public:
node(int num)
{
data = num;
lchild = NULL;
rchild = NULL;
}
friend class tree;
};
class tree
{
public:
void d0();
node *root;
void mid(node *op)
{
if (op)
{
mid(op->lchild);
cout << op->data << " ";
mid(op->rchild);
}
}
tree()
{
root=NULL;
}
void order()
{
mid(root);
cout<<endl;
}
void establish(int ns);
void d1(node *&pt);
void dell(node *root,int pos)
{
node *flag=root;
while(root)
{
if (root->data == pos)
{
if (!root->rchild && !root->lchild)
{
if (root->lchild->data!=pos)
flag->rchild= NULL;
else
flag->lchild= NULL;
return;
}
else if(root->lchild && !root->rchild)
{
root=root->lchild;
return;
}
else if(!root->lchild && root->rchild)
{
root=root->rchild;
return;
}
else
{
node *left_tree=root->lchild;
node *rightmost_son=left_tree->rchild;
if (rightmost_son)
{
while(rightmost_son->rchild)
{
left_tree=left_tree->rchild;
rightmost_son=rightmost_son->rchild;
}
root->data=rightmost_son->data;
dell(left_tree,rightmost_son->data);
return;
}
else
{
root->data=root->lchild->data;
root->lchild=root->lchild->lchild;
return;
}
}
}
else if (root->data < pos)
{
flag=root;
root=root->rchild;
}
else if(root->data > pos)
{
flag=root;
root=root->rchild;
}
}
}
void d2(node *&pc,int skey);
int f2(int y,node *ro)
{
if(ro->lchild==NULL&&ro->data>y)
return -45786;
if(ro->data<y&&ro->rchild==NULL)
return -45786;
if(ro->data==y)
return 1;
if(ro->data<y)
return 1+f2(y,ro->rchild);
if(ro->data>y)
return 1+f2(y,ro->lchild);
}
void f1(int t)
{
while(t--)
{
int key;
cin>>key;
int numm;
numm=f2(key,root);
if(numm>=0)
cout<<numm<<endl;
else
cout<<"-1"<<endl;
}
}
};
void tree::establish(int ns)
{
node *temp = new node(ns);
if (root == NULL)
{
root = temp;
}
else
{
node *m=root;
node *n=NULL;
while (1)
{
if (m == NULL)
{
if (ns < n->data)
{
n->lchild = temp;
}
else if (ns > n->data)
{
n->rchild = temp;
}
break;
}
if (ns > m->data)
{
n =m;
m = m->rchild;
}
else if (ns < m->data)
{
n = m;
m =m->lchild;
}
}
}
}
void tree::d1(node *&pt)
{
node *qs;
if(!pt->rchild && !pt->lchild)
{
delete pt;
pt=NULL;
}
else if(!pt->rchild && pt->lchild)
{
qs = pt;
pt= pt->lchild;
delete qs;
}
else if(!pt->lchild && pt->rchild)
{
qs = pt;
pt = pt->rchild;
delete qs;
}
else
{
node *par = pt;
qs = pt->lchild;
while(qs->rchild)
{
par = qs;
qs = qs->lchild;
}
pt->data = qs->data;
if(par!=pt)
par->rchild = qs->lchild;
else
par->lchild = qs->lchild;
delete qs;
}
}
void tree::d2(node *&pc, int skey)
{
if(pc)
{
if(skey==pc->data)
d1(pc);
else if(skey>pc->data)
d2(pc->rchild, skey);
else if(skey<pc->data)
d2(pc->lchild, skey);
}
}
void tree::d0()
{
int i;
int num;
node *ps;
cin>>num;
for(i=0; i<num; i++)
{
int pos;
cin >> pos;
ps=root;
d2(ps, pos);
order();
}
}
int main()
{
int t;
cin >> t;
while(t--)
{
int num;
cin >> num;
tree mytree;
int i;
for (i = 0; i < num; i++)
{
int key;
cin >> key;
mytree.establish(key);
}
mytree.order();
mytree.d0();
}
}
DS查找—二叉树平衡因子
#include<iostream>
using namespace std;
#define P 2
int g(char ac[],int num)
{
if(ac[num] != '0')
{
if(g(ac,num*P+1)>g(ac,num*P+P) )
return g(ac,num*P+1) + 1;
else
return g(ac,num*P+P) + 1;
}
else
return 0;
}
void display(char *as,int num)
{
if(as[num] == '0')
return ;
display(as,num*2+1);
display(as,num*2+2);
cout<<as[num]<<" "<<g(as,num*2+1) - g(as,num*2+2)<<endl;
}
int main()
{
int t;
char *array;
cin>>t;
int num;
int as;
int i;
int b=0;
while(t--)
{
cin>>num;
as=2;
while(as/2 < num)
as=as*2;
array = new char[as];
for(i = 0; i < num; i++)
cin>>array[i];
for(i = num; i < as; i++)
array[i] = '0';
display(array,b);
}
return 0;
}
搜索树判断
#include<bits/stdc++.h>
using namespace std;
int num;
int q[100];
int pos=0;
int flag=1;
class node
{
public:
int data;
node *lchild=NULL;
node *rchild=NULL;
friend class tree;
};
node *root;
/*class tree
{
public:
void d0();
node *root;
void mid(node *op)
{
if (op)
{
mid(op->lchild);
cout << op->data << " ";
mid(op->rchild);
}
}
tree()
{
root=NULL;
}
void order1()
{
mid(root);
cout<<endl;
}
void order2()
{
pre(root);
cout<<endl;
}
void order3()
{
hou(root);
cout<<endl;
}
void establish(int ns);
void d1(node *&pt);
void dell(node *root,int pos)
{
node *flag=root;
while(root)
{
if (root->data == pos)
{
if (!root->rchild && !root->lchild)
{
if (root->lchild->data!=pos)
flag->rchild= NULL;
else
flag->lchild= NULL;
return;
}
else if(root->lchild && !root->rchild)
{
root=root->lchild;
return;
}
else if(!root->lchild && root->rchild)
{
root=root->rchild;
return;
}
else
{
node *left_tree=root->lchild;
node *rightmost_son=left_tree->rchild;
if (rightmost_son)
{
while(rightmost_son->rchild)
{
left_tree=left_tree->rchild;
rightmost_son=rightmost_son->rchild;
}
root->data=rightmost_son->data;
dell(left_tree,rightmost_son->data);
return;
}
else
{
root->data=root->lchild->data;
root->lchild=root->lchild->lchild;
return;
}
}
}
else if (root->data < pos)
{
flag=root;
root=root->rchild;
}
else if(root->data > pos)
{
flag=root;
root=root->rchild;
}
}
}
void d2(node *&pc,int skey);
int f2(int y,node *ro)
{
if(ro->lchild==NULL&&ro->data>y)
return -45786;
if(ro->data<y&&ro->rchild==NULL)
return -45786;
if(ro->data==y)
return 1;
if(ro->data<y)
return 1+f2(y,ro->rchild);
if(ro->data>y)
return 1+f2(y,ro->lchild);
}
void f1(int t)
{
while(t--)
{
int key;
cin>>key;
int numm;
numm=f2(key,root);
if(numm>=0)
cout<<numm<<endl;
else
cout<<"-1"<<endl;
}
}
void swapt()
{
swapc(root);
}
void pre(node* pc)
{
if (pc == NULL)
return;
if (pc->data != q[pos++])
flag = 0;
pre(pc->lchild);
pre(pc->rchild);
}
void hou(node* ps)
{
if (ps== NULL)
return;
hou(ps->lchild);
hou(ps->rchild);
cout << ps->data;
if (flag == num)
cout << endl;
else
{
cout << " ";
flag++;
}
}
void swapc(node* pt)
{
if (pt == NULL)
return;
swapc(pt->lchild);
swapc(pt->rchild);
swap(pt->lchild, pt->rchild);
}
};
void tree::establish(int ns)
{
node *temp = new node(ns);
if (root == NULL)
{
root = temp;
}
else
{
node *m=root;
node *n=NULL;
while (1)
{
if (m == NULL)
{
if (ns < n->data)
{
n->lchild = temp;
}
else if (ns > n->data)
{
n->rchild = temp;
}
break;
}
if (ns > m->data)
{
n =m;
m = m->rchild;
}
else if (ns < m->data)
{
n = m;
m =m->lchild;
}
}
}
}
void tree::d1(node *&pt)
{
node *qs;
if(!pt->rchild && !pt->lchild)
{
delete pt;
pt=NULL;
}
else if(!pt->rchild && pt->lchild)
{
qs = pt;
pt= pt->lchild;
delete qs;
}
else if(!pt->lchild && pt->rchild)
{
qs = pt;
pt = pt->rchild;
delete qs;
}
else
{
node *par = pt;
qs = pt->lchild;
while(qs->rchild)
{
par = qs;
qs = qs->lchild;
}
pt->data = qs->data;
if(par!=pt)
par->rchild = qs->lchild;
else
par->lchild = qs->lchild;
delete qs;
}
}
void tree::d2(node *&pc, int skey)
{
if(pc)
{
if(skey==pc->data)
d1(pc);
else if(skey>pc->data)
d2(pc->rchild, skey);
else if(skey<pc->data)
d2(pc->lchild, skey);
}
}
void tree::d0()
{
int i;
node *ps;
cin>>num;
for(i=0; i<num; i++)
{
int pos;
cin >> pos;
ps=root;
d2(ps, pos);
}
}*/
void establish(int key)
{
node *pc = root;
node *ss = pc;
while (pc)
{
ss = pc;
if (key <pc->data)
pc = pc->lchild;
else if (key >=pc->data)
pc= pc->rchild;
}
pc = new node;
pc->data = key;
if (pc->data >= ss->data)
ss->rchild = pc;
else
ss->lchild = pc;
}
void pre(node* pc)
{
if (pc == NULL)
return;
if (pc->data != q[pos++])
flag = 0;
pre(pc->lchild);
pre(pc->rchild);
}
void hou(node* ps)
{
if (ps== NULL)
return;
hou(ps->lchild);
hou(ps->rchild);
cout << ps->data;
if (flag == num)
cout << endl;
else
{
cout << " ";
flag++;
}
}
void swapc(node* pt)
{
if (pt == NULL)
return;
swapc(pt->lchild);
swapc(pt->rchild);
swap(pt->rchild, pt->lchild);
}
int main()
{
cin >> num;
int kk;
root=new node;
cin >> kk;
q[0]=kk;
root->data=kk;
int i;
for (i = 1; i < num; i++)
{
int key;
cin >> key;
q[i]=key;
establish(key);
}
pos = 0;
pre(root);
if (flag == 1)
{
cout << "YES" << endl;
flag = 1;
hou(root);
}
else
{
flag = 1;
swapc(root);
pos = 0;
pre(root);
if (flag == 1)
{
cout << "YES" << endl;
flag = 1;
hou(root);
}
else
cout << "NO" << endl;
}
}
二叉搜索树的最近公共祖先
#include<bits/stdc++.h>
using namespace std;
typedef struct mynode
{
int data;
struct mynode *lchild;
struct mynode *rchild;
} mytree;
int panduan(mytree *tc,int y)
{
if(tc==NULL)
return 0;
else
{
if(tc->data==y)
return 1;
else if(tc->data>y)
return panduan(tc->lchild,y);
else if(tc->data<y)
return panduan(tc->rchild,y);
}
}
void establish(mytree *&ts,int key)
{
if(ts!=NULL)
{
if(ts->data < key)
return establish(ts->rchild,key);
if(ts->data > key)
return establish(ts->lchild,key);
}
else
{
ts = (mytree *)malloc(sizeof(mytree));
ts->data=key;
ts->rchild=NULL;
ts->lchild=NULL;
}
}
int f(mytree * td,int z)
{
if(td!=NULL)
{
if(td->data==z)
return 1;
if(z>td->data)
return f(td->rchild,z);
else
return f(td->lchild,z);
}
return 0;
}
bool f2(mytree *tf,int us,int vs)
{
if(us==vs)
return 1 ;
if(tf==NULL)
return 0;
else
{
if(tf->data==us)
if(f(tf,vs))
return 1;
if(us>tf->data)
return f2(tf->rchild,us,vs);
else
return f2(tf->lchild,us,vs);
}
}
int f3(mytree * ta,int ua,int va)
{
if(va>ta->data && ua>ta->data)
return f3(ta->rchild,ua,va);
else if(ua<ta->data && va<ta->data)
return f3(ta->lchild,ua,va);
else
{
return ta->data;
}
}
int main()
{
int mum;
int num;
int da;
mytree *tw=NULL;
cin >> mum;
cin >> num;
for(int i=0; i<num; i++)
{
cin >> da;
establish(tw,da);
}
int uu;
int vv;
int hs;
int hv;
for(int i=0; i<mum; i++)
{
cin >> uu;
cin >> vv;
hs=panduan(tw,uu);
hv=panduan(tw,vv);
if(!hv&&!hs)
cout<<"ERROR: "<<uu<<" and "<<vv<<" are not found."<<endl;
else if(!hv)
cout<<"ERROR: "<<vv<<" is not found."<<endl;
else if(!hs)
cout<<"ERROR: "<<uu<<" is not found."<<endl;
else
{
if(f2(tw,vv,uu))
cout << vv<<" is an ancestor of "<<uu<<"."<<endl;
else if(f2(tw,uu,vv))
cout << uu<<" is an ancestor of "<<vv<<"."<<endl;
else
{
int lll;
lll=f3(tw,uu,vv);
cout << "LCA of "<<uu<<" and "<<vv<<" is "<<lll<<"."<<endl;
}
}
}
}
(3)哈希查找:
DS哈希查找—线性探测再散列
#include<bits/stdc++.h>
using namespace std;
class hashlist
{
int *list;
int length;
public:
hashlist(int len,int num)
{
int i;
length=len;
list = new int[length];
for (i = 0; i < length; i++)
list[i] = 0;
for (i = 0; i < num; i++)
{
int keys;
cin >> keys;
hash(keys);
}
}
void hash(int keys);
void display();
void find1(int key)
{
int count;
int index;
index = -1;
count=0;
int yes;
yes= 0;
int keys;
int i;
int flag;
keys = key % 11;
for (i = 0; i < length; i++)
{
count++;
flag = (keys + i) % length;
if (!list[flag])
break;
if (list[flag] == key)
{
yes = 1;
index = flag;
break;
}
}
if (yes)
cout << yes << " " << count << " " << index + 1 << endl;
else
cout << yes << " " << count << endl;
}
};
void hashlist::display()
{
int i;
for (i = 0; i < length; i++)
{
if (i)
cout << " ";
if (list[i])
cout << list[i];
else
cout << "NULL";
}
cout << endl;
}
void hashlist::hash(int keys)
{
int keyc;
keyc = keys % 11;
int flag;
int i;
for (i = 0; i < length; i++)
{
flag = (keyc + i) % length;
if (list[flag])
continue;
list[flag] = keys;
break;
}
}
int main()
{
int t;
cin >> t;
while (t--)
{
int len;
int n;
cin >> len >> n;
hashlist mylist(len,n);
int s;
mylist.display();
cin >> s;
while (s--)
{
int keyl;
cin >> keyl;
mylist.find1(keyl);
}
}
}
DS哈希查找—二次探测再散列
#include<bits/stdc++.h>
#include<list>
using namespace std;
# define P 11
class hashlist
{
list<int> *a;
int length;
int *distance;
public:
hashlist(int n)
{
int i;
a=new list<int>[P];
for (i = 0; i < n; i++)
{
int keys;
cin >> keys;
hash(keys);
}
}
void hash(int keys);
void display();
void find3(int keys)
{
int keyc;
keyc = keys % P;
int count;
int yes;
count=0;
yes=0;
for (auto& it : a[keyc])
{
count=count+1;
if (it != keys)
continue;
yes = 1;
break;
}
if (yes)
cout<<keyc<<" "<<count<<endl;
else
{
puts("error");
a[keyc].push_front(keys);
}
}
};
/*void hashlist::display()
{
int i;
for (i = 0; i < length; i++)
{
if (i)
cout << " ";
if (list[i])
cout << list[i];
else
cout << "NULL";
}
cout << endl;
}*/
void hashlist::hash(int keys)
{
int keyc;
keyc = keys % P;
a[keyc].push_front(keys);
}
int main()
{
int num;
cin >> num;
hashlist mylist(num);
int t;
cin >> t;
while (t--)
{
int keyc;
cin >> keyc;
mylist.find3(keyc);
}
}
DS哈希查找--链地址法(表头插入)
#include<bits/stdc++.h>
#include<list>
using namespace std;
# define P 11
class hashlist
{
list<int> *a;
int length;
int *distance;
public:
hashlist(int n)
{
int i;
a=new list<int>[P];
for (i = 0; i < n; i++)
{
int keys;
cin >> keys;
hash(keys);
}
}
void hash(int keys);
void display();
void find4(int keys)
{
int keyc;
keyc = keys % 11;
int count;
int yes;
count=0;
yes=0;
for (auto& it : a[keyc])
{
count=count+1;
if (it != keys)
continue;
yes = 1;
break;
}
if (yes)
cout<<keyc<<" "<<count<<endl;
else
{
puts("error");
a[keyc].push_back(keys);
}
}
};
/*void hashlist::display()
{
int i;
for (i = 0; i < length; i++)
{
if (i)
cout << " ";
if (list[i])
cout << list[i];
else
cout << "NULL";
}
cout << endl;
}*/
void hashlist::hash(int keys)
{
int keyc;
keyc = keys % 11;
a[keyc].push_back(keys);
}
int main()
{
int num;
cin >> num;
hashlist mylist(num);
int t;
cin >> t;
while (t--)
{
int keyc;
cin >> keyc;
mylist.find4(keyc);
}
}
DS哈希查找与增补(表尾插入)
#include<iostream>
using namespace std;
#define P 2
int g(char ac[],int num)
{
if(ac[num] != '0')
{
if(g(ac,num*P+1)>g(ac,num*P+P) )
return g(ac,num*P+1) + 1;
else
return g(ac,num*P+P) + 1;
}
else
return 0;
}
void display(char *as,int num)
{
if(as[num] == '0')
return ;
display(as,num*2+1);
display(as,num*2+2);
cout<<as[num]<<" "<<g(as,num*2+1) - g(as,num*2+2)<<endl;
}
int main()
{
int t;
char *array;
cin>>t;
int num;
int as;
int i;
int b=0;
while(t--)
{
cin>>num;
as=2;
while(as/2 < num)
as=as*2;
array = new char[as];
for(i = 0; i < num; i++)
cin>>array[i];
for(i = num; i < as; i++)
array[i] = '0';
display(array,b);
}
return 0;
}
5.排序:
(1)插入排序+交换排序:
DS内排—直插排序
#include <iostream>
using namespace std;
void isdisplay(int *b, int m)
{
int i;
int j;
for (i = 2; i <= m; i++)
{
if (b[i] < b[i - 1])
{
b[0] = b[i];
for (j = i - 1; b[0] < b[j]; --j)
b[j + 1] = b[j];
b[j + 1] = b[0];
}
int k;
for (k = 1; k <= m; k++)
{
if (k != m)
cout << b[k] << " ";
else
cout << b[k] << endl;
}
}
}
int main()
{
int num;
cin >> num;
int *as;
int i;
as= new int[num+1];
for (i = 1; i <= num; i++)
{
cin >> as[i];
}
isdisplay(as, num);
}
DS排序--希尔排序
#include<iostream>
using namespace std;
int main()
{
int t;
int num;
cin >> t;
int i;
int j;
while (t--)
{
cin >> num;
int *as;
as=new int[num];
for (i = 0; i < num; i++)
cin >> as[i];
int gap;
for(gap=num/2; gap>=1; gap=gap/2)
{
for (i = 0; i < num - gap; i++)
{
for (j = i + gap; j >=gap; j=j-gap)
if (as[j] < as[j - gap])
break;
else
swap(as[j], as[j - gap]);
}
int k;
for (k = 0; k < num - 1; k++)
cout << as[k] << ' ';
cout << as[num - 1] << endl;
}
cout<<endl;
}
}
冒泡排序
#include<bits/stdc++.h>
using namespace std;
class arrs
{
int *arr;
int length;
public:
arrs(int num)
{
length = num;
int i;
arr = new int[num];
for(i=0; i<num; i++)
cin>>arr[i];
}
void bs()
{
int i;
int j;
int cnt=0;
for(i=length-1; i>0; i--)
{
for(j=0; j<i; j++)
{
if(arr[j]>arr[j+1])
{
swap(arr[j],arr[j+1]);
cnt++;
}
}
}
cout<<cnt<<endl;
}
};
int main()
{
int ns;
while (cin>>ns)
{
arrs myarr(ns);
myarr.bs();
}
}
DS排序--快速排序
#include<iostream>
using namespace std;
void quicksort(int *a,int low,int high,int n)
{
if(low>=high)
return;
int i=low;
int j=high;
int z;
for(int z=0;; z++)
{
while(1)
{
if(i>=j)
break;
if(a[j]<a[i])
{
int temp;
temp=a[j];
a[j]=a[i];
a[i]=temp;
break;
}
j--;
}
if(i>=j)
break;
while(1)
{
if(i>=j)
break;
if(a[j]<a[i])
{
int temp;
temp=a[j];
a[j]=a[i];
a[i]=temp;
break;
break;
}
i++;
}
}
int p;
for(p=0; p<n; p++)
{
if(p!=n-1)
cout<<a[p]<<" ";
else
cout<<a[p]<<endl;
}
quicksort(a,low,j-1,n);
quicksort(a,i+1,high,n);
}
int main()
{
int t;
cin>>t;
while(t--)
{
int num;
cin>>num;
int *as;
as=new int[num];
int i;
for(i=0; i<num; i++)
cin>>as[i];
quicksort(as,0,num-1,num);
cout<<endl;
}
}
大数据量的冒泡排序 (计次数)
#include<bits/stdc++.h>
using namespace std;
class arrs
{
int *arr;
int length;
public:
arrs(int num)
{
length = num;
int i;
arr = new int[num];
for(i=0; i<num; i++)
cin>>arr[i];
}
void bs()
{
int i;
int j;
int cnt=0;
for(i=length-1; i>0; i--)
{
for(j=0; j<i; j++)
{
if(arr[j]>arr[j+1])
{
swap(arr[j],arr[j+1]);
cnt++;
}
}
}
cout<<cnt<<endl;
}
};
int main()
{
int ns;
while (cin>>ns)
{
arrs myarr(ns);
myarr.bs();
}
}
与零交换
#include<bits/stdc++.h>
using namespace std;
int main()
{
int num;
vector<int> vs;
vector<int>flags;
int temp;
int cnt=0;
temp=0;
cin >> num;
vs.resize(num);
flags.resize(num, 0);
int i;
for (i = 0; i < num; i++)
cin >> vs[i];
for (i = 0; i < num; i++)
{
if (vs[i] != i&& !flags[i] )
{
int flag;
flag = 0;
int p;
p=i;
temp = 0;
while (!flags[p])
{
if (vs[p] == 0)
flag = 1;
flags[p] = 1;
p= vs[p];
temp++;
}
if (flag)
cnt= cnt+temp - 1;
else
cnt = cnt+temp + 1;
}
else
flags[i] = 1;
}
cout << cnt;
}
(2)选择排序+归并排序+其他排序:
DS排序--简单选择排序
#include<bits/stdc++.h>
using namespace std;
void ss(int as[],int num)
{
int min;
int temp;
for(int i=0; i<num; i++)
{
min=i;
int j;
for(j=i+1; j<num; j++)
{
if(as[j]<as[min])
min=j;
}
if(min!=i)
{
swap(as[j],as[min]);
}
for(int p=0; p<num-1; p++)
cout<<as[p]<<" ";
cout<<as[num-1]<<endl;
cout<<endl;
}
}
int main()
{
int i;
int t;
int num;
int temp;
int j;
cin>>t;
while(t--)
{
cin >> num;
int as[num];
for(i=0; i<num; i++)
cin >> as[i];
for(i = 0; i < num-1; i++)
{
int min = i;
for(j = i+1; j <= num-1; j++)
{
if(as[j] < as[min])
{
min = j;
}
}
if(min != i)
{
temp = as[i];
as[i] = as[min];
as[min] = temp;
}
for(int p=0; p<num-1; p++)
cout<<as[p]<<" ";
cout<<as[num-1]<<endl;
}
cout<<endl;
}
}
DS内排—堆排序
#include<bits/stdc++.h>
using namespace std;
#define P 612
int as[P] = {0};
void display(int n)
{
cout << n << " ";
int i;
for (i = 1; i <= n; i++)
{
cout << as[i];
if (i <= (n - 1))
cout << " ";
}
cout << endl;
}
void adjust(int k,int num)
{
int i;
int j;
i = k;
j = 2 * k;
while (j <= num)
{
if (j+1 <= num && as[j] > as[j + 1])
{
j++;
}
if (as[i] > as[j])
swap(as[i], as[j]);
i = j;
j = 2 * i;
}
}
void dui(int len)
{
int i;
for(i = len/2; i >= 1; --i)
{
adjust(i,len);
}
display(len);
for(i = len; i > 1; --i)
{
swap(as[1],as[i]);
adjust(1,i-1);
display(len);
}
}
int main()
{
int num;
cin >> num;
int i;
for(i = 1; i <= num; i++)
cin >> as[i];
dui(num);
}
DS内排—2-路归并排序
#include<bits/stdc++.h>
using namespace std;
void ms(int n)
{
string *numsd;
string *flag;
numsd = new string[n];
int i;
flag = new string[n];
for (i = 0; i<n; i++)
cin >> numsd[i];
int tp;
tp=2;
while(tp<n)
tp*=2;
int j;
for (i = 2; i < tp+1; i *= 2)
{
for (j = 0; j < n; j += i)
{
int left;
left = j;
int right;
right = j + i/2;
if(right>n)
break;
int mid;
mid = right -1;
int flag_loc = left;
while ( right < n&& left <= mid &&right < j + i )
{
if (numsd[left] <= numsd[right])
flag[flag_loc++] = numsd[right++];
else
flag[flag_loc++] = numsd[left++];
}
while (left <= mid)
flag[flag_loc++] = numsd[left++];
while (right < j + i && right < n)
flag[flag_loc++] = numsd[right++];
int m;
for (m = j; m< j + i && m<n; m++)
{
numsd[m] = flag[m];
}
}
int p;
for (p= 0; p<n; p++)
{
cout << numsd[p];
if (p!= n - 1)
cout << ' ';
}
cout << endl;
}
}
int main()
{
int fs;
cin >> fs;
while (fs--)
{
int num;
cin >> num;
ms(num);
cout << endl;
}
}
奥运排行榜
#include<bits/stdc++.h>
using namespace std;
struct medal
{
double jin;
double jiang;
double people;
double a_jin;
double a_jiang;
} as[612];
int main()
{
int num;
int mum;
int i;
int j;
int bp[534];
int p0;
int p1;
int p2;
int p3;
cin >> num >> mum;
for(i=0; i<num; i++)
{
cin >> as[i].jin>>as[i].jiang>>as[i].people;
as[i].a_jin=as[i].jin/as[i].people;
as[i].a_jiang=as[i].jiang/as[i].people;
}
for(i=0; i<mum; i++)
cin>>bp[i];
for(i=0; i<mum; i++)
{
p0=0;
p1=0;
p2=0;
p3=0;
for(j=0; j<num; j++)
{
if(as[bp[i]].jiang>=as[j].jiang)
p1++;
if(as[bp[i]].jin>=as[j].jin)
p0=p0+1;
if(as[bp[i]].a_jin>=as[j].a_jin)
p2=p2+1;
if(as[bp[i]].a_jiang>=as[j].a_jiang)
p3++;
}
int maxn;
maxn=p0;
int c;
c=1;
if(maxn<p1)
{
maxn=p1;
c=2;
}
if(maxn<p2)
{
maxn=p2;
c=3;
}
if(maxn<p3)
{
maxn=p3;
c=4;
}
if(i!=0)
cout<<" "<<num-maxn+1<<":"<<c;
else
cout<<num-maxn+1<<":"<<c;
}
}
关于堆的判断
#include<bits/stdc++.h>
using namespace std;
#define maxn 6120
int mum;
int as[maxn];
int num;
int find(int key)
{
int i;
for (i = 1; i <= num; i++)
{
if(as[i]==key)
return i;
}
return 0;
}
int main()
{
cin >> num >> mum;
int i;
for (i = 1; i <= num; i++)
{
cin >> as[i];
int k;
k=i;
while(as[k]<as[k/2]&&k>1)
{
swap(as[k],as[k/2]);
k=k/2;
}
}
while(mum--)
{
int xd;
cin >> xd;
string str;
cin >> str;
if(str=="is")
{
string sstr;
cin >> sstr;
if(sstr=="the")
{
string ssstr;
cin >> ssstr;
if(ssstr=="root")
{
if(as[1]!=xd)
cout << "F" << endl;
else
cout << "T" <<endl;
}
else
{
string sd1;
int xxd;
cin >> sd1 >> xxd;
if(find(xd)!=find(xxd)/2)
cout << "F" << endl;
else
cout << "T" << endl;
}
}
else if(sstr=="a")
{
string sd1,sd2;
int xxd;
cin >> sd1 >> sd2 >> xxd;
if(find(xd)/2!=find(xxd))
cout << "F" << endl;
else
cout << "T" << endl;
}
}
else if(str=="and")
{
int xxd;
string sd1,sd2;
cin >> xxd >> sd1 >> sd2;
if(find(xd)/2!=find(xxd)/2)
cout << "F" << endl;
else
cout << "T" << endl;
}
}
}
插入排序还是归并排序
#include<bits/stdc++.h>
using namespace std;
void display(int *as, int m)
{
int i;
for(i=0; i<m; i++)
{
if(i!=0)
cout<<" "<<as[i];
else
cout<<as[i];
}
}
void NextInsertion(int *PMids, int ks, int Ns)
{
cout<<"Insertion Sort"<<endl;
int i;
int temp;
temp = PMids[ks+1];
for(i=ks+1; PMids[i-1]>temp&& i>0 ; i--)
PMids[i] = PMids[i-1];
PMids[i] = temp;
display(PMids, Ns);
}
int MergeLength(int *PMids, int Ns)
{
for(int L=2; L<Ns; L*=2)
{
for(int i=1; L*i<Ns; i+=2)
{
if(PMids[L*i-1]>PMids[L*i])
return L;
}
}
}
void Merge(int *As, int *tmpAs, int Ls, int Rs, int RightEnds)
{
int LeftEnds;
LeftEnds = Rs-1;
int tmpi;
tmpi = Ls;
while(Rs<=RightEnds && Ls<=LeftEnds)
{
if(As[Ls]<=As[Rs])
tmpAs[tmpi++] = As[Ls++];
else
tmpAs[tmpi++] = As[Rs++];
}
for(; Ls<=LeftEnds; )
tmpAs[tmpi++] = As[Ls++];
for(; Rs<=RightEnds; )
tmpAs[tmpi++] = As[Rs++];
}
int IsInsertion(int *Ps, int *PMids, int Ns)
{
int i;
for(i=0; i<Ns-1; i++)
{
if(PMids[i]>PMids[i+1])
break;
}
int j;
for(j=i+1; j<Ns; j++)
{
if(Ps[j]!=PMids[j])
return 0;
}
return i;
}
void NextMerge(int *PMids, int Nc)
{
cout<<"Merge Sort"<<endl;
int *tmpA = (int *)malloc(Nc*sizeof(int));
int l;
l = MergeLength(PMids, Nc);
int i;
int j;
for(i=0; (i+1)*2*l-1<Nc ; i++)
Merge(PMids, tmpA, i*2*l, i*2*l+l, (i+1)*2*l-1);
if(i*2*l+l-1<Nc)
{
Merge(PMids, tmpA, i*2*l, i*2*l+l, Nc-1);
}
if(i*2*l+l-1>=Nc)
{
for(j=i*2*l; j<Nc; j++)
tmpA[j] = PMids[j];
}
display(tmpA, Nc);
free(tmpA);
}
int main()
{
int num;
cin >> num;
int *ps = (int *)malloc(num*sizeof(int));
int *pmid = (int *)malloc(num*sizeof(int));
int i;
for(i=0; i<num; i++)
cin>>ps[i];
for(i=0; i<num; i++)
cin>>pmid[i];
int kfc=IsInsertion(ps, pmid, num);
if(kfc)
NextInsertion(pmid, kfc, num);
else
NextMerge(pmid, num);
free(ps);
free(pmid);
}