zoukankan      html  css  js  c++  java
  • 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);
    }
  • 相关阅读:
    jQuery.validationEngine前端验证
    Ztree异步树加载
    asp.net后台编写 loading效果
    [ASP.NET] 使用Loading遮罩防止使用者重複點擊
    Easy UI 遮罩(MASK)
    jQueryEasyUI Messager基本使用
    jquery easyui datagrid使用参考
    asp.net mvc 2.o 中使用JQuery.uploadify
    ie9,10 uploadify cleanUp bug
    SQL Server 2005 镜像构建手册
  • 原文地址:https://www.cnblogs.com/oldfish123/p/13749895.html
Copyright © 2011-2022 走看看