数组元素循环左移/右移的“两种”思路

(以下用n表示 数组元素总数 m表示 移动位数)
均以右移为例

思路1:

思路:将123456分割成前n-m

优点:运算次数较少

代码实现:(仅函数部分)

int ArrayShift( int a[], int n, int m )***//函数形参中的a[]看成指针*a = a***
{
     	//1234 56
	// n-m m
	//4321 65
	//561234
	int i,j,inv[100] = {
     0};
	m = m % n; ***//考虑到m可能大于n造成循环的问题***
	for(i=0; i<n-m ; i++)
	{
     	inv[i] = a[n-m-1-i];
	}
	
	for(i=n-m, j=0; i<n; i++,j++)
	{
     	inv[i] = a[n-1-j];
	}
	//实现了第一行到第二行的转换
	for(i=0; i<n; i++)
	{
     	a[i] = inv[n-1-i];
	}
	return 0;
}

思路2:

思路:将末位搬到第一位,再将其他位向后移

优点:简单易于理解

代码实现:

int ArrayShift( int a[], int n, int m )
{
      //*a = a; 
 //123456
 //612345
 //561234
 m = m % n;
 int b[100];
 int i,j,temp;
 for(j=0; j<m; j++)
 {
     
  temp = a[n-1];
  for(i=n-1; i>0; i--) //右移倒着减,左移正着加 
  {
      
   a[i] = a[i-1];
  }
  a[0] = temp;
 }
 return 0;
}

你可能感兴趣的:(C语言,新手入门,数组,数组元素循环移动,多种思路)