线性表(一)——数组循环右移算法
源码: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;
}
线性表(一)——数组循环右移算法的更多相关文章
- JavaScript 数据结构与算法之美 - 线性表(数组、栈、队列、链表)
前言 基础知识就像是一座大楼的地基,它决定了我们的技术高度. 我们应该多掌握一些可移值的技术或者再过十几年应该都不会过时的技术,数据结构与算法就是其中之一. 栈.队列.链表.堆 是数据结构与算法中的基 ...
- PTA 数组循环右移
6-2 数组循环右移 (20 分) 本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>)个整数,将每个整数循环向右移m(≥)个位置,即将a中的数据由(a0a1⋯ ...
- 第2章 线性表《C#数据结构和算法》
( )除第一个位置的数据 元素外,其它数据元素位置的前面都只有一个数据元素:( )除最后一个位置的 数据元素外,其它数据元素位置的后面都只有一个元素.也就是说,数据元素是 一个接一个的排列.因此,可以 ...
- 数据结构线性表的动态分配顺序存储结构算法c语言具体实现和算法时间复杂度分析
#include<stdio.h>#include<stdlib.h>//线性表的动态分配顺序存储结构#define LIST_INIT_SIZE 100//线性表存储空间的初 ...
- C语言实现顺序表的基本操作(从键盘输入 生成线性表,读txt文件生成线性表和数组生成线性表----三种写法)
经过三天的时间终于把顺序表的操作实现搞定了.(主要是在测试部分停留了太长时间) 1. 线性表顺序存储的概念:指的是在内存中用一段地址连续的存储单元依次存储线性表中的元素. 2. 采用的实现方式:一段地 ...
- c++线性表和数组的区别
在传统C语言程序中,描述顺序表的存储表示有两种方式:静态方式.动态方式 顺序表的静态存储表示: #define maxSize 100 typedefintT; typedefstruct{ T da ...
- 线性表(存储结构数组)--Java 实现
/*线性表的数组实现 *特点:插入删除慢需要平均移动一半的数据,查找较快 *注意:有重复和无重复的数据对应的操作会有些不同 *注意数组一旦创建其大小就固定了 *Java集合长度可变是由于创建新的数组将 ...
- Java探索之旅(10)——数组线性表ArrayList和字符串生成器StringBuffer/StringBuilder
1.数组线性表ArrayList 数组一旦定义则不可改变大小.ArrayList可以不限定个数的存储对象.添加,插入,删除,查找比较数组更加容易.可以直接使用引用类型变量名输出,相当于toString ...
- 线性表(List)
1.什么是线性表(List)? 零个或多个数据元素的有限序列. (1)元素之间是有序的. (2)线性表强调是有限的. 2.线性表有哪些操作? (1)线性表的创建和初始化,InitList (2)判空, ...
随机推荐
- JS模块化库seajs体验
seajs http://seajs.org/docs/en.html#intro https://github.com/seajs/seajs/releases Extremely simple e ...
- js web实现移动端触控
// 触摸事件 $(".m_l_i_l a").on("touchstart", function(){ $(this).css("color&quo ...
- iOS开发中NSLog输出格式大全
本文的内容是总结了一下iOS开发中NSLog输出格式大全,虽然比较基础,但有总结毕竟会各位正在学习iOS开发的朋友们一些小小的帮助. %@ 对象 %d, %i ...
- GWT入门学习之下载安装
1.准备 安装 jdk: 下载路径:http://download.oracle.com/otn-pub/java/jdk/8u92-b14/jdk-8u92-windows-i586.exe?Aut ...
- 从头开始一步一步实现EF6+Autofac+MVC5+Bootstarp极简前后台ajax表格展示及分页(二)前端修改、添加表格行点击弹出模态框
在前一篇中,由于不懂jquery,前端做的太差了,今天做稍做修改,增加一个跳转到指定页面功能,表格行点击样式变化.并且在表格中加入bootstarp的按钮组,按钮点击后弹出模态框,须修改common, ...
- 初试“七牛云”--零基础运用七牛云配合UEditor实现图片的上传和浏览(.NET篇)
(注册和建立存储空间就不介绍了,网上一把一把的资料,自己试着点点也能明白) 作为一个成熟的菜鸟,如果遇到一个新问题,第一步当然是先百度一下... 看了N个关于七牛云的使用的帖子,表示还是蒙圈的,看懂了 ...
- iOS OAuth2.0认证和SSO授权
OAuth2.0和SSO授权 一.OAuth2.0授权协议 一种安全的登陆协议,用户提交的账户密码不提交到本APP,而是提交到授权服务器,待服务器确认后,返回本APP一个访问令牌,本APP即可用该 ...
- Linux休眠,挂起,待机,关机的区别及相关命令
休眠是一种更加省电的模式,它将内存中的数据保存于硬盘中,所有设备都停止工作.当再次使用时需按开关机键,机器将会恢复到您的执行休眠时的状态,而不用再次执行启动操作系统复杂的过程. 待机(挂起)是将当前处 ...
- UVa 12299 RMQ with Shifts(移位RMQ)
p.MsoNormal { margin: 0pt; margin-bottom: .0001pt; text-align: justify; font-family: "Times New ...
- ZooKeeper 编程(一)
Zookeeper的节点都是存放在内存中的,所以读写速度很快.更新日志被记录到了磁盘中,以便用于恢复数据.在更新内在中节点数之前,会先序列化到磁盘中. 为避免单点失效,zookeeper的数据是在多个 ...