注册 登录
编程论坛 C++教室

数组右移问题

ldsh304 发布于 2016-10-28 18:33, 2172 次点击
一个数组A中存有N(N>0)个整数,在不允许使用其它数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN-M-1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

我的思想是:先把数组后m个数和前m个数先交换,然后用递归
但是总是在 n-m < m 的时候用递归时有问题,怎样修改
程序代码:
#include <iostream>
using namespace std;

const int MaxSize = 100;

void swap(int &a, int &b)
{
    a ^= b;
    b ^= a;
    a ^= b;
}

/*
    n : 对n个数进行处理

    m : 要改变位置的m个数

    len : a[]的使用长度

   

*/

void reserve(int a[],int start,  int n, int m,const int len)
{
    cout << start <<endl;
    if (start + ((n-m > m)?m:(n-m))== len || n==m)//这里可能有问题

    {
        return ;
    }
    int i = start;

    if (m < n-m)
    {
        for (; i < start + m; i++)
        {
            cout << a[i] << "   <   " << a[n-m+i] << endl;
            swap(a[i], a[n-m+i]);//交换前m个后m个数

        }
        reserve(a, start+m,  n-m, m,len);
      

    }
    else if (m == n-m)
    {
        for (; i < m; i++)
        {
            cout << a[i] << "   =   " << a[m+i] << endl;
            swap(a[i], a[m+i]);//要处理的前m个数和后m个数正好是整个数组的元素

        }
    }
    else
    {
      

        for (; i < start + n - m; i++)
        {
            cout << a[i] << "   >   " << a[n-m+i] << endl;
            swap(a[i], a[n-m+i]);//交换前m个后m个数

        }
        reserve(a, start+n-m, m, m, len);//这里可能有问题

    }
   

}

int main()
{
    int n, m;
    int a[MaxSize];
    int i = 0;
    cin >> n >> m;
    for (; i < n; i++)
    {
        cin >> a[i];
    }
    m = m % n;
    if (m != n)
        reserve(a, 0, n, m,n);
   

    for (i = 0; i < n-1; i++)
    {
        cout << a[i] << " ";
    }
    cout << a[i] << endl;
    return 0;
}

3 回复
#2
rjsp2016-10-31 09:05
std::rotate
#3
ldsh3042016-10-31 16:57
哦哦,谢谢了
#4
rjsp2016-10-31 21:33
回复 3楼 ldsh304
std::rotate 针对 链表 和 数组 使用了不同的移位算法,你看源码,很有意思的
针对数组,直接移到最终位置,需要循环 最大公约数 次
针对链表,前面颠倒,后面颠倒,再整体颠倒
1