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