做类似交易猫的网站有一个箭头的做网站的软件
做类似交易猫的网站,有一个箭头的做网站的软件,农产品品牌策划方案,快速做网站联系电话假期结束#xff0c;看点题目。 第一题 问题 设顺序表用数组A[]表示#xff0c;表中元素存储在数组下标1~mn的范围内#xff0c;前m个元素递增有序#xff0c;后n个元素递增有序#xff0c;设计一个算法#xff0c;使得整个顺序表有序。 #xff08;1#xff09;给出算… 假期结束看点题目。 第一题 问题 设顺序表用数组A[]表示表中元素存储在数组下标1~mn的范围内前m个元素递增有序后n个元素递增有序设计一个算法使得整个顺序表有序。 1给出算法的基本设计思想。 2根据设计思想采用C或C语言描述算法关键之处给出注释。 3说明你所设计算法的时间复杂度和空间复杂度。 解答 1算法基本设计思想 将数组A[]中的mn个元素假设元素为int型看成两个顺序表表L和表R。将数组当前状态看做起始状态即此时表L由A[]中前m个元素构成表R由A[]中后n个元素构成。要使A[]中mn个元素整体有序只需将表R中的元素逐个插入表L中的合适位置即可。插入过程取表 R中的第一个元素A[m1]存入辅助变量temp中让temp逐个与A[m],A[m-1],…,A[1]进行比较当tempA[j]1≤j≤m时将A[j]后移一位否则将temp存入A[j1]中。重复上述过程继续插入A[m2],A[m3],……,A[mn]最终A[]中元素整体有序。 2算法描述 void Insert(int A[],int m,int n){int i,j;int temp; //辅助变量用来暂存待插入元素。for(im1;imn;i) { //将A[m1…mn]插入到A[1…m]中。tempA[i];for(ji-1;j1tempA[j];j--)A[j1]A[j]; //元素后移以便腾出一个位置插入temp。A[j1]temp; //在j1位置插入temp。}
}3算法时间和空间复杂度 ①本题的规模由m和n共同决定。取最内侧循环中A[j1]A[j];这一句作为基本操作其执行次数在最坏的情况下为f(m,n)(mmn-1)n/2mnn2/2–n/22 ②算法额外空间中只有一个变量temp因此空间复杂度为O(1)。 第二题 问题 已知递增有序的单链表A,BA,B中元素个数分别为m,n且A,B都带有头结点分别存储了一个集合请设计算法以求出两个集合A和B的差集A-B即仅由在A中出现而不在B中出现的元素所构成的集合。将差集保存在单链表A中并保持元素的递增有序性。 1给出算法的基本设计思想。 2根据设计思想采用C或C语言描述算法关键之处给出注释。 3说明你所设计算法的时间复杂度。 解答 1算法基本设计思想 只需从A中删去A与B中共有的元素即可。由于两个链表中元素是递增有序的所以可以这么做设置两个指针p, q开始时分别指向A和B的开始结点。循环进行以下判断和操作如果p所指结点的值小于q所指结点值则p后移一位如果q所指结点的值小于p所指结点的值则q后移一位如果两者所指结点的值相同则删除p所指结点。最后p与q任一指针为NULL的时候算法结束。 2算法描述 void Difference(LNode *A, LNode *B) {LNode *p A-next, *q B-next; //p和q分别是链表A和B的工作指针。LNode *pre A;LNode *r;while(p ! NULL q ! NULL) {if(p-data q-data) {pre p; //pre 为A中p所指结点的前驱结点的指针。p p-next; //A链表中当前结点指针后移。}else if (p-data q-data)q q-next;else {pre-next p-next; //B 链表中当前结点指针后移。r p; //处理AB中元素值相同的结点应删除。p p-next;free(r); // 删除结点。}}
}3算法时间复杂度分析 由算法描述可知算法规模由m和n共同确定。算法中有一个单层循环循环内的所有操作都是常数级的因此可以用循环执行的次数作为基本操作执行的次数。可见循环执行的次数即为p, q两指针沿着各自链表移动的次数考虑最坏的情况即p, q都走完了自己所在的链表循环执行mn次。即时间复杂度为O(mn)。 第三题 问题 设计一个算法将顺序表中的所有元素逆置。 解答 两个变量ij指示顺序表的第一个元素和最后一个元素交换ij所指元素然后i向后移动一个位置j向前移动一个位置如此循环直到i与j相遇时结束此时顺序表L中的元素已经逆置。 void reverse(Sqlist L) { //L要改变用引用型int i,j;int temp; //辅助变量用于交换for(i1,jL.length;ij;i,j--) { //当i与j相遇时循环结束tempL.data[i];L.data[i]L.data[j];L.data[j]temp;}
}注意本题中 for 循环的执行条件要写成i j 而不要写成i ! j 。如果数组中元素有偶数个则 i 与 j 会出现下图所示状态此时i 继续往右走j 继续往左走会互相跨越对方循环不会结束。 第四题 问题 设计一个算法从一给定的顺序表L中删除下标i到ji≤j包括ij之间的所有元素假定i,j都是合法的。 解答 本题是顺序表删除算法的扩展可以采用如下方法解决从第j1个元素开始到最后一个元素为止用这之间的每个元素去覆盖从这个元素开始往前数第j-i1个元素即可完成删除i~j之间的所有元素。 本题代码如下 void Delete(Sqlist L,int i,int j) { //L要改变用引用型。int k,l;l j-i1; //元素要移动的距离。for(k j 1;k L.length; k) {L.data[k-l] L.data[k]; //用第k个元素去覆盖它前边的第l个元素。}L.length - l; //表长改变。
}第五题 问题 有一个顺序表L其元素为整型数据设计一个算法将L中所有小于表头元素的整数放在前半部分大于的整数放在后半部分数组从下表1开始存储。 解答 本题可以这样解决先将L的第一个元素存于变量temp中然后定义两个整型变量i,j。i从左往右扫描j从右往左扫描。边扫描边交换。具体执行过程如下 各步的解释如下 ①开始状态temp 2,i 1; j L.length ②j先移动从右往左边移动边检查j所指元素是否比2小此时发现-1比2小则执行L.data[i]L.data[j];i;i中元素已经被存入temp所以可以直接覆盖并且i后移一位准备开始i的扫描 ③i开始移动从左往右边移动边检测看是否i所指元素比2大此时发现-7比2小因此i在此位置是什么都不做。 ④i继续往右移动此时i所指元素为-3也比2小此时什么都不做。 ⑤i继续往右移动此时i所指元素为5比2大因此执行L.data[j] L.data[i]; j--j中元素已被保存j前移一位准备开始j的扫描 ⑥j往左运动此时j所指元素为6比2大j在此位置时什么都不做。 ⑦j继续往左移动此时ji说明扫描结束。 ⑧执行L.data[i] temp;此时整个过程结束所有比2小的元素被移到了2前边所有比2大的元素被移到了2后边。 以上过程要搞清楚两点 ①i和j是轮流移动的即当i找到比2大的元素时将i所指元素放入j所指位置i停在当前位置不j开始移动。j找到比2小的元素将j所指元素放在i所指位置j停在当前位置不动i开始移动如此交替直到ij。 ②每次元素覆盖比如执行L.data[i] L.data[j];不会造成元素丢失因为在这之前被覆盖位置的元素已经存入其他位置。由以上分析可写出如下算法 void move(Sqlist L) { //L要改变所以用引用型int temp;int i 1,j L.length;temp L.data[i];while(ij){/*关键步骤开始*/while(i jL.data[j] temp) j--; //j从左往右扫描当来到第一个比temp小的元素时停止 ,并且每走一步都要判断i是否小于j,这个判断容易遗漏。if(i j) { //检测看是否已仍满足i j这一步同样很重要L.data[i] L.data[j]; //移动元素。i; //i右移一位。}while(i jL.data[i] temp) i; //与上边的处理类似。if(i j) { //与上边的处理类似。L.data[j] L.data[i]; //与上边的处理类似。j--;}/*关键步骤结束*/}L.data[i] temp; //将表首元素放在最终位置。
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/89975.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!