C语言算法 设计一个算法,将数组m个元素循环右移。要求算法空间复杂度为O(1)

题目如题:数组是一个常规一维数组,

直接放代码,代码讲解见注解

#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);
}

 

posted @ 2020-09-29 15:29  雾漫大武汉  阅读(498)  评论(0编辑  收藏  举报