源码:rshift.cpp

#include "stdafx.h"
#include <stdio.h> /************************************************************************/
/* 数组循环右移算法 */
/************************************************************************/ /*
* 要求:只用一个元素大小的辅助空间,且时间复杂度为O(n)
*/ //************************************
// Method: 求最大公约数(辗转相除)
// FullName: gcd
// Access: public
// Returns: int
// Qualifier:
// Parameter: int m
// Parameter: int n
//************************************
int gcd(int m, int n)
{
return n ? gcd(n, m % n) : m;
} //************************************
// Method: 循环右移解法一(通俗解法)
// FullName: rshift1
// Access: public
// Returns: void
// Qualifier:
// Parameter: int array[]
// Parameter: int length
// Parameter: int shift
//************************************
void rshift1(int array[], int length, int shift)
{
//求最少循环移动链的数量
//设length=m,shift=n
//则[0] -> [n%m] -> [2n%m] -> ... -> [mn%m]=[0]=起始
//假设kn%m==0,令m=gcd*X,n=gcd*Y,则X与Y互斥
//则k*Y%X==0,Y与X互斥,故X能整除k,故k=m/gcd
//k是一条链条的长度,故链条的数量为m/k=gcd
int least_movement = gcd(length, shift);//最少循环移动链的数量
int i;
for (i = 0; i < least_movement; i++)
{
int swap_a = i;
int swap_b = (i + shift) % length;
int tmp = array[swap_a];
while (swap_b != i)
{
array[swap_a] = array[swap_b];
swap_a = swap_b;
swap_b = (swap_b + shift) % length;
}
array[swap_a] = tmp;
}
} //************************************
// Method: 循环右移解法二(翻转解法)
// FullName: rshift2
// Access: public
// Returns: void
// Qualifier:
// Parameter: int array[]
// Parameter: int length
// Parameter: int shift
//************************************
void rshift2(int array[], int length, int shift)
{
//翻手掌算法
//设length=m,shift=n(n=n%m)
//方法:分割数组 => array1[0 .. n-1] | array2[ n .. m-1 ]
//array1翻转,array2翻转,再整体翻转
//
//原先: 1,2,3,4,..,n-1 | n,...,m-2,m-1
//各自翻转: n-1,n-2,...,2,1 | m-1,m-2,...,n
//全部翻转: n,n+1,...,m-2,m-1 | 1,2,3,...,n-2,n-1
//这就完成了右移n单位的任务
int i;
shift %= length;
int tmp;
for (i = 0; i < (shift - 1) / 2; i++)
{
tmp = array[i];
array[i] = array[shift - i - 1];
array[shift - i - 1] = tmp;
}
for (i = shift; i < shift + (length - shift) / 2; i++)
{
tmp = array[i];
array[i] = array[length + shift - i - 1];
array[length + shift - i - 1] = tmp;
}
for (i = 0; i < length / 2; i++)
{
tmp = array[i];
array[i] = array[length - i - 1];
array[length - i - 1] = tmp;
}
} void print_array(int array[], int length)
{
int i;
for (i = 0; i < length; i++)
{
printf("%d ", array[i]);
}
printf("\n");
} int main(int argc, char* argv[])
{
int a[] = { 1,2,3,4,5,6 };
printf("=====================\n");
print_array(a, 6);
printf("========== rshift ==========\n");
rshift1(a, 6, 3);
print_array(a, 6);
printf("========== rshift ==========\n");
rshift2(a, 6, 3);
print_array(a, 6);
return 0;
}

线性表(一)——数组循环右移算法的更多相关文章

  1. JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)

    前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...

  2. PTA 数组循环右移

    6-2 数组循环右移 (20 分)   本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>)个整数,将每个整数循环向右移m(≥)个位置,即将a中的数据由(a​0​​a​1​​⋯ ...

  3. 第2章 线性表《C#数据结构和算法》

    ( )除第一个位置的数据 元素外,其它数据元素位置的前面都只有一个数据元素:( )除最后一个位置的 数据元素外,其它数据元素位置的后面都只有一个元素.也就是说,数据元素是 一个接一个的排列.因此,可以 ...

  4. 数据结构线性表的动态分配顺序存储结构算法c语言具体实现和算法时间复杂度分析

    #include<stdio.h>#include<stdlib.h>//线性表的动态分配顺序存储结构#define LIST_INIT_SIZE 100//线性表存储空间的初 ...

  5. C语言实现顺序表的基本操作(从键盘输入 生成线性表,读txt文件生成线性表和数组生成线性表----三种写法)

    经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1. 线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2. 采用的实现方式:一段地 ...

  6. c++线性表和数组的区别

    在传统C语言程序中,描述顺序表的存储表示有两种方式:静态方式.动态方式 顺序表的静态存储表示: #define maxSize 100 typedefintT; typedefstruct{ T da ...

  7. 线性表(存储结构数组)--Java 实现

    /*线性表的数组实现 *特点:插入删除慢需要平均移动一半的数据,查找较快 *注意:有重复和无重复的数据对应的操作会有些不同 *注意数组一旦创建其大小就固定了 *Java集合长度可变是由于创建新的数组将 ...

  8. Java探索之旅(10)——数组线性表ArrayList和字符串生成器StringBuffer/StringBuilder

    1.数组线性表ArrayList 数组一旦定义则不可改变大小.ArrayList可以不限定个数的存储对象.添加,插入,删除,查找比较数组更加容易.可以直接使用引用类型变量名输出,相当于toString ...

  9. 线性表(List)

    1.什么是线性表(List)? 零个或多个数据元素的有限序列. (1)元素之间是有序的. (2)线性表强调是有限的. 2.线性表有哪些操作? (1)线性表的创建和初始化,InitList (2)判空, ...

随机推荐

  1. RDIFramework.NET ━ 9.15 个性化设置 ━ Web部分

    RDIFramework.NET ━ .NET快速信息化系统开发框架 9.15  个性化设置 -Web部分 个性化设置,主要针对用户的偏好对界面进行设置,主界面如下: 9.15.1界面皮肤设置 目前框 ...

  2. in-list iterator

    in-list iterator --针对目标sql的in后面是常量集合的首选项处理方法,其处理效率通常都会比in-list expansion高--使用in-list iterator的时候,in所 ...

  3. 网页中调用Google地图

    <html> <head>  <meta http-equiv="Content-Type" content="text/html; cha ...

  4. spring基础整理

    spring基础教程:https://www.tutorialspoint.com/spring/spring_overview.htm 注入实例 <bean id="" c ...

  5. [2]R语言在数据处理上的禀赋之——可视化技术

    本文目录 Java的可视化技术 R的可视化技术 二维做图利器plot的参数配置 *权限机制 *plot独有的参数 *plot的type介绍 *title介绍 *公共参数集合--par *par的权限机 ...

  6. HTML5 UI框架Kendo UI Web自定义组件(一)

    Kendo UI Web包含数百个创建HTML5 web app的必备元素,包括UI组件.数据源.验证.一个MVVM框架.主题.模板等.在Kendo UI Web中如何创建自定义组件呢,在下面的文章中 ...

  7. android通知栏总结

    通知消息的发送 12-1:消息管理者 NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION ...

  8. oracle 卸载

    由于工作需要,重装了一下Oracle,然后发现同SQLServer,MySQL等数据库相比,Oracle的卸载重装真是不一般的麻烦.     整理了一下我的Oracle的卸载重装过程,给自己备忘,同时 ...

  9. ADB指令

    对于ADB指令的应用,首先应该配置环境,将文件所在路径复制到高级系统设置里面的环境变量path,然后就可以在命令符上进行ADB的指示 例如adb kill-server是关掉活动 adb start- ...

  10. python 学习笔记十四 jQuery案例详解(进阶篇)

    1.选择器和筛选器 案例1 <!DOCTYPE html> <html lang="en"> <head> <meta charset=& ...