下面的算法(文字叙述形式),用来将数组a[n]的每个元素都循环地右移k位,这里1≤h≤n。算法描述如下:步骤1)将数组分成两段,左段长为n-k,右段长为k。步骤2)分别将
试设计一个算法,将数组An 中的元素A[0]至A[n-1]循环右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n)解:分析:要把A的元素循环右移k位,
分析算法,第一次调用Reverse函数的时间复杂度为O(k),第二次调用Reverse函数的时间复杂度为O(n-k),第三次调用Reverse函数的时间复杂度为O(n),所以,总的时间复杂度为O(n)。 ⑵ 已知数组A[n]中的元素为整型,设计算法将其调整为左右两部分,左边所有元素为奇数,右边所有元素为偶数,并要求算法的时间复杂度为O(...
试设计一个算法,将数组A。中的元素A[0]至A[n-1]循环右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n)。 相关知识点: 试题来源: 解析 本题难点在于找到O(n)的算法。注意分析研究此问题的数学性质,以寻求好 的算法。本题有多种解法,但要注意不要将在特殊条件下出现的现象当作一般规...
假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位。比较之后,不难看出,其中有两段的顺序是不变的:1234和abcd,可把这两段看成两个整体。右移K位的过程就是把数组的两部分交换一下。变换的过程通过以下步骤完成: 1. 逆序排列abcd:abcd1234 → dcba1234; ...
高级解法(线性时间):假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位。比较之后,不难看出,其中有两段的顺序是不变的:1234和abcd,可把这两段看成两个整体。右移K位(即右移K = K % N位)的过程就是把数组的两部分交换一下。变换的过程通过以下步骤完成: ...
C数据结构题目5.18⑤试设计一个算法,将数组A中的元素 A[0..n-1]循环右移k位,并要求只用一个元素 大小的附加存储,元素移动或交换次数为O(n)。 要求实现以下函数: voidRotate(Array1D&a,intn,intk); 一维数组类型Array1D的定义: typedefElemTypeArray1D[MAXLEN]; voidRotate(Array1D&a,intn,intk) /*a[...
数组的循环右移K位算法,仅使用一个附加的空间,交换次数或元素移动时间复杂度为O(n); /*步骤分为三步:(K=2) 1.将第 1 位至第 N-K 位进行反转;1,2,3, 4,5->3,2,1, 4,5 2.将第 N-K+1 位至第 N 位进行反转;3,2,1, 4,5->3,2,1, 5,4 ...
试设计一个算法,将数组A中的元素A[0]至A[n-1]循环右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n). 分析:我们看这个数组123456,循环右移2位。先将数组逆序,654321,交换3次,然后交换前两个,564321,然后右面四个数字逆序,则561234,交换2次,正好是6次,并且在交换数据的时候,只使用了一...
2.那么数组元素的移动,无非也是变量值的交换,你是右移动K位,那么假设用变量T过度.设现在要将 i 移到 i+K 的位置,(假设 i 和 i+k 在0--N之间)应该:T = A(I+K)A(I+K) = A(I)A(I) = T 接下来,要考虑,当 i + K 大于n的处理,留给你自己解决吧!