大学计算机:教学课件:-数据结构常见算法PPT文档格式.ppt
《大学计算机:教学课件:-数据结构常见算法PPT文档格式.ppt》由会员分享,可在线阅读,更多相关《大学计算机:教学课件:-数据结构常见算法PPT文档格式.ppt(92页珍藏版)》请在冰豆网上搜索。
i0;
i-)result=result*x+ai-1;
线性表,设计一个时间复杂度为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,inti,j,n;
int*a;
cinnk;
k=k%n;
a=newintn;
iai;
i+)j=(i+k)%n;
bj=ai;
时间复杂度?
空间复杂度?
空间复杂度更少的方法,假设原数组序列为abcd1234,循环右移了4位数组序列为1234abcd。
右移后,有两段的顺序是不变的:
1234和abcd,可把这两段看成两个整体。
右移K位的过程就是把数组的两部分交换一下。
变换的过程通过以下步骤完成:
1.逆序排列abcd:
abcd1234dcba1234;
2.逆序排列1234:
dcba1234dcba4321;
3.全部逆序:
dcba43211234abcd。
更一般的情况:
根据K%N的大小,将数据分成两段,第一段长度为N-K个数据,第二段中有K个数据然后分别将两段逆序,最后将整个数组逆序,voidconvert(inta,intstart,intend)intk,temp;
for(k=0;
k(end-start+1)/2;
k+)temp=astart+k;
astart+k=aend-k;
aend-k=temp;
voidyiwei(inta,intn,intk)convert(a,0,k-1);
convert(a,k,n-1);
convert(a,0,n-1);
已知数组元素为整型,设计算法将其调整为左右两部分,左边元素为奇数,右边元素为偶数,算法分析设计两个工作指针,分别指向数组的两端(I=0;
j=n-1).然后,重复的进行以下工作:
如果ij:
从左向后扫描数组,直到遇到第一个偶数从右向左扫描数组,直到遇到第一个奇数如果ij交换ai、aj的数据,同时修改i,j的值,继续进行2的工作,intn,*a;
cinn;
a=newintn;
inti=0,j=n-1;
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-,#includestdafx.h#includeclasschangeprivate:
int*a,length;
public:
change()coutlength;
a=newintlength;
coutai;
voidtrans()inti=0,j=length-1;
inttemp;
j-;
return;
voiddisplay()inti=0;
ilength;
i+)coutai;
coutendl;
intmain(intargc,char*argv)changea;
coutbeforechange:
;
a.display();
a.trans();
coutafterchange:
return0;
返回,设单链表以非递减有序排列,设计算法,实现在单链表中删去系统的多余结点,基本思想:
从头结点出发,进行链表的遍历,在遍历的过程中,设置两个工作指针p和q(q=p-next),比较p、q所指向的节点的值,如果相同,则删除q所指向的节点,,算法描述,设置工作指针p、q,并进行初始化:
p=list.head-next;
if(!
p)returnelseq=p-next;
在q!
=NULL的情况下,重复进行以下工作:
if(p-data=q-data)temp=q;
p-next=q-next;
q=p-next;
deletetempelsep=q;
q=q-next;
templatevoidDeleteSame(LinkLista)Node*p,*q,*temp;
p=a.GetHead()-next;
p)coutnext;
while(q)if(p-data=q-data)temp=q;
deletetemp;
elsep=q;
判断带头节点的双循环链表是否对称,设置两个工作指针p=首元节点,q=尾节点,重复进行以下工作:
比较p和q的值,如果不想等,停止比较,返回false如果相等,观察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-datareturnfalse;
elseif(p-right=q|p-right-right=q)returntrue;
elsep=p-right;
q=q-left;
返回,已知一个单链表中的数据元素含有三类字符:
编写算法,构造三个循环链表,使得每个循环链表中之包含同一类字符,基本思想每个链表都带有头结点。
原始链表为A,分类之后新增B,C,使得A存放字母,B存放数字,C存放其他字符基本过程:
在A中进行遍历,并检查遍历到的符号,如果是字符,不做任何处理(继续后移指针);
如果是数字,则将其采用尾插法加入到B中(继续后移指针),如果是第三类符号,则将其采用尾插法插入到C中(继续后移指针),算法分析,已知链表A,构造两个空循环链表B(数字),C(其他字符)设置工作指针p;
p=A.first(头结点)定义一个辅助指针q,完成工作:
如果q!
=A.firstIsDigital(q-data),则将q从A中删除,并将其链入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链表遍历结束,templatestructNodeTdata;
Node*next;
templateclassCycleListNode*head,*rear;
intLength;
CycleList()head=newNode;
head-next=head;
rear=head;
CycleList(intn);
voidDisplay();
Node*GetHead()returnhead;
voidappend(Node*p);
friendvoidSegment(CycleLista);
templatevoidCycleList:
append(Node*p)p-next=rear-next;
rear-next=p;
rear=p;
templateCycleList:
CycleList(intn)Tinput;
Node*s;
head=newNode;
Length=n;
inti=0;
iinput;
s=newNode;
s-data=input;
append(s);
Display()Node*p;
p=head-next;
while(p!
=head)coutdatanext;
coutendl;
templatevoidSegment(CycleListA)Node*p,*q,*ahead,*temp;
CycleListB,C;
coutnext;
templatewhile(q!
=ahead)if(q-data=0,intmain(intargc,char*argv)CycleListA(10);
A.Display();
Segment(A);
返回,templatewhile(q!
=ahead)if(q-data=0,队列,求解素数环问题列车重排问题杨辉三角形,返回,求解素数环问题,问题描述:
将n个自然数排成环,使得每相邻两数之和为素数,构成一个素数环。
例子:
1,2,3,4,7,10,9,8,5,6,求解思想,先将1放入素数环中。
对2n之间的自然数组成对列,依次将元素出队,测试其是否与素数环中的最后一个数的和为素数,如成立,则将其加入素数环,否则,将其加入到对列中,等待再次处理重复2中操作,直到队列空,代码分析,publicclassPrimeRingpublicPrimeRing(intn)SeqListring=newSeqList(n);
ring.add(newInteger
(1);
LinkedQueueq=newLinkedQueue();
for(inti=2;
i=n;
i+)q.enqueue(newInteger(i);
inti=0;
while(!
q.isEmpty()intk=q.dequeue().intValue();
/出队System.out.print(dequeue:
+k+t);
if(isPrime(ring.get(i)+k)i+;
ring.add(newInteger(k);
elseq.enqueue(newInteger(k);
System.out.println(素数环:
+ring.toString();
返回,判断一个正整数a是不是素数,只要将所有的小于等于根号a且大于1的素数都除不尽,则a就是素数。
这是判断素数引理6首先0和1不是素数、2是素数、能被2整除的不是素数,(素数肯定是奇数)排除这些数后然后对num进行开平方根,从3开始到这个平方根,每隔2判断一下(奇数肯定不能被偶数整除),看看num能否被其整除,如果能就不是素数,