数组移位

题目:一个数组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;
    }
}

 

  

posted @ 2016-04-08 16:08  天目山电鳗  阅读(1310)  评论(0编辑  收藏  举报