题目如题:数组是一个常规一维数组,
直接放代码,代码讲解见注解
#include<stdio.h>
void swap(int a[],int i,int j)
{
a[i]=a[i]+a[j]-(a[j]=a[i]);
}
void insert(int a[],int i,int n)//插入算法,每次把第i个数放到这个数组的最后面
{
int key=a[i];//插入算法的核心思想和插入排序当中是一样的,设定一个key,让key插入到最后面
while(i<n)
{
a[i]=a[i+1];
++i;
if(i+1==n)//当i处于数组最后一位的时候,停止循环
break;
}
a[i]=key;//在数组最后一位插入要插入的元素
}
void move_array(int a[],int n,int m)
{
int i=0,j=n-m;//设定i,j来交换
while(j<n)
swap(a,i++,j++);
if(m<(n/2))//若交换的数是大于数组数量一半的时候,不需要接下来的一部分
{
int cnt=0;//加入计数器
/*
经过以上步骤,例如1,2,3,4,5,6,7,8,9向右循环2个元素,得到8,9,3,4,5,6,7,1,2
我们需要将3,4,5,6,7移动到1,2的后面,这就需要移动n-2*m个元素,我用插入法来实现这个算法
insert函数每次设定m位的元素位key,key通过算法插入到数组的最后一位
调用insert n-2*m次以后即可完成3,4,5,6,7的移动
*/
while(cnt<n-2*m)
{
insert(a,m,n);
++cnt;
}
}
}
void print(int a[],int n)
{
for(int i=0;i<n;i++)
printf("%d ",a[i]);
}
int main(){
int a[]={1,2,3,4,5,6,7,8,9,10};
int n=10;
move_array(a, n, 3);
print(a, n);
}