数据结构期末机考下

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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值