数组移位

题目:一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移动M位(M>=0),将数组(A1A2...An-1An)变化成(An-mAn-m+1...A1...An-m-1)。

书本上提供的方法是:(1)每次向右移动一位,移动M次。移动次数N*M。

          (2)先将数组倒序,再局部倒序两次。即(A1....An)->(An...A1)->(An-m...AnAn-m-1....A1)->(An-mAn-m+1...A1...An-m-1)。移动次数3N次。

自创方法,跳变法。将原始位装入m位后的位置,m位数据寄存在temp中,再往右m位。如果回到原始起点并且计算次数未达数组长度,则原始位+1继续上述过程。当计算次数等于数组长度的时候,过程结束。大约使用N次交换。

//研究跳变的数组下标是否有重复

void countingIndex()
{
    int a=0;
    int a1=0;
    int b=10;
    int c=9;
    int i=0;
    while(1)
    {
        cout<<a<<endl;
        i++;
        a+=c;
        if(a>(b-1))
            a=a-b;
        if(a==a1 && i!=b)
        {
            a+=1;
            a1+=1;
        }
        else if(i==b)
            break;
            
    }
    cout<<"次数:"<<i<<endl;
}

 

  

//数组移动---改变数组结构版本
void Arraymoving1(int a[],int M,int N)
{
    if(M==0)
        return;
    else if(M%N==0)
        return;
    else
    {
        int begin=0;
        int mark=0;
        int b=N;
        int c=M%N;//处理成小于长度的余数
        int i=0;
        int temp=a[begin];
        while(1)
        {
            //当前状态


            i++;
            //跳转状态+M
            begin+=c;        
            if(begin>(b-1))
                begin=begin-b;
            //交换


            swapNumber(temp,a[begin]);


            if(begin==mark && i!=b)
            {
                begin+=1;
                mark+=1;
                temp=a[begin];
            }
            else if(i==b)
                break;        
        }
        cout<<"次数:"<<i<<endl;
        return;
    }
}

 

  

转载于:https://www.cnblogs.com/chentingk/p/5368558.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值