1、数据结构算法,数据结构,数据结构是一门研究非数值计算的程序设计问题中的操作对象(结点)以及它们之间关系和操作等的学科。1968 年克努思教授开创了数据结构的最初体系,他所著的计算机程序设计艺术第一卷基本算法是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作。70 年代初,数据结构作为一门独立的课程开始进入大学课堂。下面介绍数据结构中常见的一些基本算法,关于算法线性表上的常见算法基于队列的常见算法基于栈的常见算法,数据结构常见算法,算法,多项式求的两种方法A(x)=anxn+an-1xn-1+a0A(x)=(anx+an-1)X+an-2)+a0,A(x)=anxn+an-1xn-1+a
2、0,templateT Poly1(T a,int n,T x)int i,j;T result=0;T xn,xx;for(i=0;in;i+)xn=1;xx=x;for(j=0;ji;j+)xn=xn*xx;result=ai*xn+result;return result;,A(x)=(anx+an-1)X+an-2)+a0,templateT Poly2(T a,int n,T x)int i,j;T result=0;T xn,xx;result=an-1;for(i=n-1;i0;i-)result=result*x+ai-1;return result;,线性表,设计一个时间复杂
3、度为O(n)的算法,实现将数组An中所有元素循环右移K个位置已知数组元素为整型,设计算法将其调整为左右两部分,左边元素为奇数,右边元素为偶数设单链表以非递减有序排列,设计算法,实现在单链表中删去系统的多余结点设单链表以非递减有序排列,设计算法,实现在单链表中删去系统的多余结点已知一个单链表中的数据元素含有三类字符:数字、字母和其他字符。编写算法,构造三个循环链表,使得每个循环链表中之包含同一类字符,返回,设计一个时间复杂度为O(n)的算法,实现将数组An中所有元素循环右移K个位置,算法分析kn。k=k%N,A,B(k=1),B(k=2),B(k=3),j=(i+k)%N,int i,j,n;i
4、nt*a;cinnk;k=k%n;a=new intn;for(i=0;i ai;for(i=0;in;i+)j=(i+k)%n;bj=ai;,时间复杂度?空间复杂度?,空间复杂度更少的方法,假设原数组序列为abcd1234,循环右移了4位数组序列为1234abcd。右移后,有两段的顺序是不变的:1234和abcd,可把这两段看成两个整体。右移K位的过程就是把数组的两部分交换一下。变换的过程通过以下步骤完成:1.逆序排列abcd:abcd1234 dcba1234;2.逆序排列1234:dcba1234 dcba4321;3.全部逆序:dcba4321 1234abcd。,更一般的情况:,根据
5、K%N的大小,将数据分成两段,第一段长度为N-K个数据,第二段中有K个数据然后分别将两段逆序,最后将整个数组逆序,void convert(int a,int start,int end)int k,temp;for(k=0;k(end-start+1)/2;k+)temp=astart+k;astart+k=aend-k;aend-k=temp;,void yiwei(int a,int n,int k)convert(a,0,k-1);convert(a,k,n-1);convert(a,0,n-1);,已知数组元素为整型,设计算法将其调整为左右两部分,左边元素为奇数,右边元素为偶数,算法
6、分析设计两个工作指针,分别指向数组的两端(I=0;j=n-1).然后,重复的进行以下工作:如果ij:从左向后扫描数组,直到遇到第一个偶数从右向左扫描数组,直到遇到第一个奇数如果ij 交换ai、aj的数据,同时修改i,j的值,继续进行2的工作,int n,*a;cinn;a=new int n;int i=0,j=n-1;for(i=0;iai;i=0;while(ij)while(ai%2=1)i+;while(aj%2=0)j-;if(ij)temp=ai;ai=aj;aj=temp;i+;j-,#include stdafx.h#include class changeprivate:in
7、t*a,length;public:change()coutlength;a=new intlength;coutai;,void trans()int i=0,j=length-1;int temp;while(ij)while(ai%2=1)i+;while(aj%2=0)j-;if(ij)temp=ai;ai=aj;aj=temp;i+;j-;return;,void display()int i=0;for(i=0;ilength;i+)cout ai;cout endl;int main(int argc,char*argv)change a;coutbefore change:;a
8、.display();a.trans();coutafter change:;a.display();return 0;,返 回,设单链表以非递减有序排列,设计算法,实现在单链表中删去系统的多余结点,基本思想:从头结点出发,进行链表的遍历,在遍历的过程中,设置两个工作指针p和q(q=p-next),比较p、q所指向的节点的值,如果相同,则删除q所指向的节点,,算法描述,设置工作指针p、q,并进行初始化:p=list.head-next;if(!p)return else q=p-next;在q!=NULL的情况下,重复进行以下工作:if(p-data=q-data)temp=q;p-next=
9、q-next;q=p-next;delete tempelse p=q;q=q-next;,template void DeleteSame(LinkList a)Node*p,*q,*temp;p=a.GetHead()-next;if(!p)coutnext;while(q)if(p-data=q-data)temp=q;p-next=q-next;q=p-next;delete temp;elsep=q;q=q-next;return;,判断带头节点的双循环链表是否对称,设置两个工作指针p=首元节点,q=尾节点,重复进行以下工作:比较p和q的值,如果不想等,停止比较,返回false如果相
10、等,观察p、q是否相邻(p-right=q,p-right-right=q),如果相邻,返回true,否则p=p-right,q=q-left,first,1.定义两个工作指针、,并进行初始化:=list.first-right;q=list.first-left;2.重复进行以下工作(while(1)if(p-data!=q-data return false;else if(p-right=q|p-right-right=q)return true;else p=p-right;q=q-left;,返 回,已知一个单链表中的数据元素含有三类字符:数字、字母和其他字符。编写算法,构造三个循环
11、链表,使得每个循环链表中之包含同一类字符,基本思想每个链表都带有头结点。原始链表为A,分类之后新增B,C,使得A存放字母,B存放数字,C存放其他字符基本过程:在A中进行遍历,并检查遍历到的符号,如果是字符,不做任何处理(继续后移指针);如果是数字,则将其采用尾插法加入到B中(继续后移指针),如果是第三类符号,则将其采用尾插法插入到C中(继续后移指针),算法分析,已知链表A,构造两个空循环链表B(数字),C(其他字符)设置工作指针p;p=A.first(头结点)定义一个辅助指针q,完成工作:q=p-next;如果q!=A.firstIsDigital(q-data),则将q从A中删除,并将其链入
12、B中temp=q;p-next=q-next,q=p-next;temp-next=B.first;B.rear-next=temp;B.rear=p;q-data 是其他字符,则将其从A中删除,并将其链入C中重复进行上述工作,直到A链表遍历结束,template struct NodeT data;Node*next;template class CycleListNode*head,*rear;int Length;public:CycleList()head=new Node;head-next=head;rear=head;CycleList(int n);void Display()
13、;Node*GetHead()return head;void append(Node*p);friend void Segment(CycleList a);,template void CycleList:append(Node*p)p-next=rear-next;rear-next=p;rear=p;return;,template CycleList:CycleList(int n)T input;Node*s;head=new Node;head-next=head;rear=head;Length=n;int i=0;for(i=0;iinput;s=new Node;s-dat
14、a=input;append(s);,template void CycleList:Display()Node*p;p=head-next;while(p!=head)cout datanext;coutendl;,template void Segment(CycleList A)Node*p,*q,*ahead,*temp;CycleList B,C;cout next;,template while(q!=ahead)if(q-data=0,int main(int argc,char*argv)CycleList A(10);A.Display();Segment(A);return
15、 0;,返 回,template while(q!=ahead)if(q-data=0,队列,求解素数环问题列车重排问题杨辉三角形,返回,求解素数环问题,问题描述:将n个自然数排成环,使得每相邻两数之和为素数,构成一个素数环。例子:1,2,3,4,7,10,9,8,5,6,求解思想,先将1放入素数环中。对2n之间的自然数组成对列,依次将元素出队,测试其是否与素数环中的最后一个数的和为素数,如成立,则将其加入素数环,否则,将其加入到对列中,等待再次处理重复2中操作,直到队列空,代码分析,public class PrimeRing public PrimeRing(int n)SeqList r
16、ing=new SeqList(n);ring.add(new Integer(1);LinkedQueue q=new LinkedQueue();for(int i=2;i=n;i+)q.enqueue(new Integer(i);,int i=0;while(!q.isEmpty()int k=q.dequeue().intValue();/出队 System.out.print(dequeue:+k+t);if(isPrime(ring.get(i)+k)i+;ring.add(new Integer(k);else q.enqueue(new Integer(k);System.out.println(素数环:+ring.toString();,返 回,判断一个正整数a是不是素数,只要将所有的小于等于根号a且大于1的素数都除不尽,则a就是素数。这是判断素数引理6 首先0和1不是素数、2是素数、能被2整除的不是素数,(素数肯定是奇数)排除这些数后然后对num进行开平方根,从3开始到这个平方根,每隔2判断一下(奇数肯定不能被偶数整除),看看num能否被其整除,如果能就不是素数,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1