精华内容
下载资源
问答
  • void rotateP(int a[], int n, int p){ int i, j, temp; for(i = 0; i < p; i++){ temp = a[0]; for(j = 0; j<n-1; j++){ a[j] = a[j+1]; } a[n-1] = temp;... int a[6] = { 1,...
    void rotateP(int a[], int n, int p){
    	int i, j, temp;
    	for(i = 0; i < p; i++){
    		temp = a[0];
    		for(j = 0; j<n-1; j++){
    			//将a[0]后面的所有元素向前移动一位
    			a[j] = a[j+1];
    		}
    		a[n-1] = temp;//把移动之前的首项放入数组末尾
    	}
    }
    
    int main() {
    	int a[6] = { 1,2,3,4,5,6 };
    	int i;
    	//reversek(a, 6, 2);
    	rotateP(a, 6, 2);
    	for (i = 0; i < 6; i++) {
    		printf("%d,", a[i]);
    	}
    	
    	return 0;
    }
    

    运行结果

    展开全文
  • 数组循环左移P位算法

    2017-09-07 14:16:47
    设计一个代码将R中的序列循环左移P(0),即将R中的数据由 {X0,X1,……Xn-1}变换为{Xp,Xp+1,……,Xn-1,X0,X1,……,Xp-1} 分析:将前P个元素逆置,再将剩下的元素逆置,最后将所有元素逆置
  • 数组循环左移 c++实现

    2018-06-20 11:06:28
    请编写程序将一个大小为n的整数数组循环左移m位。如:1,2,3,4,5,6,7,8循环左移三位后结果是:4,5,6,7,8,1,2,3.
  • 课程设计题目:用 Reverse 实现时间复杂度为 O(n)O(n)O(n) 数组循环左移算法 一、问题描述 设计一个时间复杂度为 O(n)O(n)O(n) 的算法,实现将数组 A[n] 中所有元素循环左移 kkk 个位置。 详见王红梅等编著的《数据...

    课程设计题目:用 Reverse 实现时间复杂度为 O ( n ) O(n) O(n) 数组循环左移算法

    一、问题描述

    设计一个时间复杂度为 O ( n ) O(n) O(n) 的算法,实现将数组 A[n] 中所有元素循环左移 k k k 个位置。

    详见王红梅等编著的《数据结构(C++版)(第2版)》P53页习题5(1)。

    二、基本要求

    1. 实现将数组 A[n] 中所有元素循环左移 k k k 个位置。

    2. 时间复杂度为 O ( n ) O(n) O(n)

    三、概要设计

    1. 算法的设计

    算法思路参考王红梅等编著的《数据结构(C++版)(第2版)》P16页思想火花,出自BW Kernighan和PJ Plauger于1981年发表的著作Software tools in Pascal

    1. 设计reverse(first, last)函数,用于实现反转从firstlast(不含)之间的元素;

    2. 通过3次reverse实现将数组 A[n] 中所有元素循环左移 k k k 个位置:

      reverse(a, a + k)

      reverse(a + k, a + n)

      reverse(a, a + n)

    四、详细设计

    1. 设计每个函数

    void Reverse(int *first, int *last)
    {
        last--;
        for (int temp; first < last; first++, last--)
            temp = *first, *first = *last, *last = temp;
    }
    

    2. 设计主函数

    int main()
    {
        reverse(a, a + k);
        reverse(a + k, a + n);
        reverse(a, a + n);
    }
    

    五、运行与测试

    1. 测试环境

    运行环境:Windows 20H2, i7-9750H @ 2.60GHz, 16GB RAM

    编译器:gcc version 8.1.0 (x86_64-posix-seh-rev0, Built by MinGW-W64 project)

    编译命令:-g

    运行终端:cmd

    2. 在调试程序的过程中遇到的问题与解决方案

    暂未发现异常。

    3. 设计的测试数据与测试结果

    测试3次。输入k,然后生成一个随机数组并输出,数组所有元素循环左移 k k k 个位置后再输出。

    4. 程序清单及运行结果

    4.1 A[n] 为整型数组

    程序清单如下。

    // ex1_2.cpp
    
    /*
     * 1. 编写程序:课本p53页习题5(1),先做整数,然后改用模板函数做并测试。
     * 课本p53页习题5(1):设计一个时间复杂度为 O(n) 的算法,实现将数组 A[n] 中所有元素循环左移 k 个位置。
     * 模板
     */
    
    #include <iostream>
    #include <ctime>
    using namespace std;
    
    template <typename T>
    void Reverse(T *first, T *last)
    {
        last--;
        for (T temp; first < last; first++, last--)
            temp = *first, *first = *last, *last = temp;
    }
    
    int main()
    {
        srand(time(NULL));
    
        int n = 10, k;
        cout << "Please input k(0 < k < 10): ";
        cin >> k;
    
        int A[n];
        for (int i = 0; i < n; i++)
            cout << (A[i] = rand()) << " ";
        cout << endl;
    
        Reverse(A, A + k);
        Reverse(A + k, A + n);
        Reverse(A, A + n);
    
        for (int i = 0; i < n; i++)
            cout << A[i] << " ";
        cout << endl;
    
        double B[n];
        for (int i = 0; i < n; i++)
            cout << (B[i] = (double)rand() / (rand() + 1)) << " ";
        cout << endl;
    
        Reverse(B, B + k);
        Reverse(B + k, B + n);
        Reverse(B, B + n);
    
        for (int i = 0; i < n; i++)
            cout << B[i] << " ";
        cout << endl;
    
        return 0;
    }
    

    第1次测试(符合预期)

    D:\OneDrive - mail2.sysu.edu.cn\MyDocuments\code\DSA\week03>ex1
    Please input k(0 < k < 10): 3
    31255 22925 30731 23452 21176 11048 16126 26806 17875 16867
    23452 21176 11048 16126 26806 17875 16867 31255 22925 30731

    第2次测试(符合预期)

    D:\OneDrive - mail2.sysu.edu.cn\MyDocuments\code\DSA\week03>ex1
    Please input k(0 < k < 10): 4
    31297 31583 821 8595 24193 29328 23820 21519 3149 2478
    24193 29328 23820 21519 3149 2478 31297 31583 821 8595

    第3次测试(符合预期)

    D:\OneDrive - mail2.sysu.edu.cn\MyDocuments\code\DSA\week03>ex1
    Please input k(0 < k < 10): 5
    31310 9040 6742 6545 32684 12267 3502 9810 3660 10654
    12267 3502 9810 3660 10654 31310 9040 6742 6545 32684

    4.2 模板

    #include <iostream>
    #include <ctime>
    using namespace std;
    
    template <typename T>
    void Reverse(T *first, T *last)
    {
        last--;
        for (T temp; first < last; first++, last--)
            temp = *first, *first = *last, *last = temp;
    }
    
    int main()
    {
        srand(time(NULL));
    
        int n = 10, k;
        cout << "Please input k(0 < k < 10): ";
        cin >> k;
    
        int A[n];
        for (int i = 0; i < n; i++)
            cout << (A[i] = rand()) << " ";
        cout << endl;
    
        Reverse(A, A + k);
        Reverse(A + k, A + n);
        Reverse(A, A + n);
    
        for (int i = 0; i < n; i++)
            cout << A[i] << " ";
        cout << endl;
    
        double B[n];
        for (int i = 0; i < n; i++)
            cout << (B[i] = (double)rand() / (rand() + 1)) << " ";
        cout << endl;
    
        Reverse(B, B + k);
        Reverse(B + k, B + n);
        Reverse(B, B + n);
    
        for (int i = 0; i < n; i++)
            cout << B[i] << " ";
        cout << endl;
    
        return 0;
    }
    

    第1次测试(符合预期)

    D:\OneDrive - mail2.sysu.edu.cn\MyDocuments\code\DSA\week03>ex1_2
    Please input k(0 < k < 10): 3
    31607 4105 26750 850 21038 9151 24591 5572 31655 8236
    850 21038 9151 24591 5572 31655 8236 31607 4105 26750
    0.551057 2.53344 0.209033 6.9253 0.0571197 1.1675 53.6444 0.791821 0.250341 1.0277
    6.9253 0.0571197 1.1675 53.6444 0.791821 0.250341 1.0277 0.551057 2.53344 0.209033

    第2次测试(符合预期)

    D:\OneDrive - mail2.sysu.edu.cn\MyDocuments\code\DSA\week03>ex1_2
    Please input k(0 < k < 10): 4
    31624 25079 17767 22863 7075 28785 7385 23704 15909 10263
    7075 28785 7385 23704 15909 10263 31624 25079 17767 22863
    0.511611 0.172095 1.52812 1.01504 0.720147 9.04 10.3216 0.00956241 2.05172 0.394671
    0.720147 9.04 10.3216 0.00956241 2.05172 0.394671 0.511611 0.172095 1.52812 1.01504

    第3次测试(符合预期)

    D:\OneDrive - mail2.sysu.edu.cn\MyDocuments\code\DSA\week03>ex1_2
    Please input k(0 < k < 10): 5
    31653 23511 14704 10057 1602 31357 2629 30126 673 20467
    31357 2629 30126 673 20467 31653 23511 14704 10057 1602
    0.4426 0.60074 5.66135 0.316398 0.906047 2.21183 135.865 0.0243682 0.37898 0.211203
    2.21183 135.865 0.0243682 0.37898 0.211203 0.4426 0.60074 5.66135 0.316398 0.906047

    六、总结与心得

    算法之美,妙不可言!

    七、参考资料

    1. 王红梅, 胡明, 王涛. 数据结构 (C++ 版)[M]. 清华大学出版社, 2005.

    2. Kernighan B W, Plauger P J. Software tools in Pascal[J]. 1981.

    展开全文
  • 数组循环左移

    2017-09-07 14:20:04
    设计一个代码将R中的序列循环左移P(0),即将R中的数据由 {X0,X1,……Xn-1}变换为{Xp,Xp+1,……,Xn-1,X0,X1,……,Xp-1} 分析:将前P个元素逆置,再将剩下的元素逆置,最后将所有元素逆置
  • 数组循环左移问题

    2021-02-27 21:17:51
    数组循环左移问题的三种解法问题/题干 描述解法1解法2解法3 问题/题干 描述 将一个具有n个元素的数组向左循环移动i个位置。 这只一个很实用的问题,很多应用程序会调用这个问题的算法,例如在文本编辑器中移动行的...

    数组循环左移问题的三种解法

    问题/题干 描述

    将一个具有n个元素的数组向左循环移动i个位置。
    这只一个很实用的问题,很多应用程序会调用这个问题的算法,例如在文本编辑器中移动行的操作,磁盘整理时交换两个不同大小的相邻内存块等。所有解决这个问题的算法要求有较高的时间性能和空间性能。

    解法1

    先将数组前i个元素存放于另一个临时数组,再将余下的n-i个元素左移i个位置,最后将前i个元素从临时数组复制会原数组后面i个位置。
    总共需要移动i+(n-i)+i=i+n次数组元素,使用了i个额外的存储单元。

    解法2

    设计一个函数,将数组向左循环1个位置,循环i次。
    移动i*n次数组元素,使用了1个额外数组单元。

    解法3

    换个角度看:
    把这个问题看做数组AB转换为数组BA的问题(A代表数组前i个元素,B代表余下n-i个元素)。
    先将A取逆得A-1B,再将B取逆得A-1B-1, 最后将整个A-1B-1取逆得BA
    下面通过reverse函数演示一下,对abcdefgh左移3个元素位置:
    reverse(0, i-1); cbadefgh
    reverse(i, n-1); cbahgfed
    reverse(0,n-1); defghabc

    该算法总共交换i/2 + (n-i)/2 + n/2 = n次数组元素,使用了1个用来交换的数组单元。
    Brian Kernighan 在Software Tools in Pascal中使用了这个算法在文本编辑器中移动各行。

    展开全文
  • 设将n个整数存放到一维数组R中,试设计一个在时间和空间两方面尽可能有效的算法,将R中保有的序列循环左移P(0<P<n)个位置,即将R中的数据由(X0X1……Xn-1)变换为(XpXp+1……Xn-1X0X1……Xp-1) 数据结构考研的...

    设将n个整数存放到一维数组R中,试设计一个在时间和空间两方面尽可能有效的算法,将R中保有的序列循环左移P(0<P<n)个位置,即将R中的数据由(X0X1……Xn-1)变换为(XpXp+1……Xn-1X0X1……Xp-1)

    数据结构考研的题目。网上搜了下,给我看yue了,还是我自己来吧。

    这道题目,可以设计出一个时间复杂度为O(n)的非递归原地算法出来,相信时间空间两方面都很难再高效点了。思路如下:

    对数组(X0X1……Xn-1)左移p位,我们可以把数组分为((X0X1……Xp-1 | XpXp+1……Xn-1)两部分。

    若p<n/2,我们可以选择把(X0X1……Xp-1)和(Xn-pXn-p+1……Xn-1)依次交换,此时数组已经变为(Xn-pXn-p+1……Xn-1 | XpXp+1……Xn-p-1 | X0X1……Xp-1)这三部分。但是最后一部分已经到位了,不需要再操作了,因此需要处理的只有前两部分,即(Xn-pXn-p+1……Xn-1 | XpXp+1……Xn-p-1)这一个小了一截的数组。

    诶,那股子“子结构”的感觉是不是出来了?若p>n/2,那就把后面的提到前面即可,操作大差不差。

    这个算法抽象来讲,就是一轮一轮地把数组的子串通过元素交换的方式放到它应该的位置,直到换无可换。

    下面是代码:

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };//数组
    const int length = 10;//数组长度
    
    //令数组左循环n位
    
    void forth(int lef, int mid, int rig) {//将数组的后(length-n)个元素与前(length-n)个元素依次对调
    	int i = lef, j = mid + 1;
    	while (j <= rig)
    		swap(arr[i++], arr[j++]);
    }
    
    void retreat(int lef, int mid, int rig) {//将数组的前n个元素与后n个元素依次对调
    	int i = mid, j = rig;
    	while (i >=lef)
    		swap(arr[i--], arr[j--]);
    }
    
    int main() {
    	unsigned int n;//左移位数
    	cin >> n;
    	n %= length;
    	int lef = 0, mid = n - 1, rig = length - 1;
    	while (mid >= lef && mid < rig) {
    		if (mid - lef < rig - mid - 1) {
    		//当前需要位移的子串长度小于当前处理的子串长度的一半,就直接把这个子串往后交换
    			retreat(lef, mid, rig);
    			rig -= (mid - lef + 1);
    		}
    		else {
    		//当前需要位移的子串长度大于当前处理的子串长度的一半,就得把剩下那个小的子串往前交换
    			forth(lef, mid, rig);
    			lef += (rig - mid);
    		}
    	}
    	for (int i = 0; i < length; ++i)cout << arr[i] << " ";
    	cout << endl;
    	return 0;
    }
    

    每次交换都是旧元素和新元素相交换,没有重复交换的情况,因此时间复杂度为O(n);使用的是原地算法,因此空间复杂度为O(1)。

    展开全文
  • 文章转载自TOMORROW 星辰,原文链接:数组循环左移最优算法:逆置算法 设将 n 个整数存放到一维数组 R 中。试设计一个在时间和空间两方面都尽可能高效的算法,将 R 中的元素序列循环左移 p 个位置。 该问题的一个...
  • 数组循环左移 目录数组循环左移简介思路代码 简介 思路 题目只要输出,那就直接输出题目想要的结果就完事了 代码 #include<iostream> #include <algorithm> using namespace std; #define Max 101 int ...
  • PTA 7-5 数组循环左移

    2020-04-21 19:20:07
    本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a​0​a1​⋯an−1​​)变换为(am​⋯...
  • c语言 数组循环左移m位

    千次阅读 2019-08-18 23:27:04
    //循环数组左移算法 void rightshiftleft(int *p_num,int n,int m){ //临时变量 int temp = 0; //外层循环控制需要左移的次数 for(int k = 0;k ; k++){ temp = p_num[n - m + k]; //内层循环控制n-m的数组...
  • 本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a​0​​a​1​​⋯a​n−1​​)变换为...
  • 7-2 数组循环左移 (10分) 本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有 n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移 m(≥0)个位置,即将a中的数据由(a​...
  • C语言实现数组循环左移/右移

    千次阅读 2019-10-08 18:51:49
    // n是数组元素个数,k是循环移动位数 void leftMove(int A[], int n, int k) { for(int i = 0; i < k % n; i++){ int x = A[0]; for(int j = 0; j < n - 1; j++){ A[j] = A[j + 1]; }
  • 将一维数组(x0,x1,…,xn-1)循环左移p位(0<p<n),变为(xp,xp+1,…,xn-1,x0,x1,…,xp-1) 例如: 一维数组: (1,2,3,4,5,6,7,8,9,10),令p=4 最终得到一维数组:(5,6,7,8,9,10,1,2,3,4) ...
  • PTA 数据结构 数组循环左移

    千次阅读 2018-12-20 20:57:41
    7-1 数组循环左移 (20 分) 本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(&gt;0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a​0...
  • 数组循环左移m位

    2021-05-02 10:43:35
    #include<stdio.h> int main() { int a[101]; int n,m,i; scanf("%d %d",&n,&m); for(i=0;i<n;i++) scanf("%d",&a[i]); m=m%n; for(i=m;i<m+n;i++){ if(i<... els.
  • 数组循环左移p个位置

    千次阅读 2018-03-25 11:54:44
    算法】将一维数组arr中的元素循环左移p个位置 原创 2017年05月03日 23:35:35 &lt;ul class="article_tags...
  • 数组循环左移

    2020-03-12 15:17:28
    试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移p (0<p<n) 个位置,即将R中的数据序列由(x0, x1,……,xn-1)变换为(xp,xp+1,……,xn-1,x0,x1,……,xp-1)。 在没学算法之前...
  • 数组循环左移 本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a​0​​ a​1​​ ⋯a​n...
  • 先将数组前i个元素存在临时数组,在将余下的n-i个元素左移i个位置,最后将临时数组中的元素复制到后面i个位置 复杂度: 需移动i+(n-i)+i = i+n 次数组单元 需i个额外存储单元 解法二: 设计一个函数将数组向左移动一个...
  • C++实验02(04)数组循环左移

    千次阅读 2020-05-02 15:04:24
    题目描述 (要求通过下标和指针访问...最后输出循环左移后的A数组循环左移方法如下所示。在这个实例中k=3。 (本题中n为5) 如果循环左移前,A中存放的内容是: 11 12 13 14 15 21 22 23 24 25 31 32 33 34 35 41 ...
  • PTA 数组循环左移

    万次阅读 2017-03-08 23:24:26
    习题2.2 数组循环左移 (20分) 本题要求实现一个对数组进行循环左移的简单函数:一个数组aa中存有nn(>0>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移mm(\ge 0≥0)个位置,即将aa中的数据...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,889
精华内容 5,955
关键字:

数组的循环左移算法