#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); }
C语言算法 设计一个算法,将数组m个元素循环右移。要求算法空间复杂度为O(1)
原文:https://www.cnblogs.com/oldfish123/p/13749895.html