数组循环位移 三种
来源:互联网 发布:淘宝立即购买图标 编辑:程序博客网 时间:2024/05/16 10:56
#include <iostream>using namespace std;/*void RightShift1(char *arr, int N, int k){ while(k--){ char t = arr[N-1]; for(int i = N-1; i > 0; i--) arr[i] = arr[i-1]; arr[0] = t; }}*/void RightShift1(int *arr, int N, int k){ k %= N; while(k--){ char t = arr[N-1]; for(int i = N-1; i > 0; i--) arr[i] = arr[i-1]; arr[0] = t; }}void Reverse(int *arr, int b, int e){ for(; b < e; b++, e--){ char temp = arr[e]; arr[e] = arr[b]; arr[b] = temp; }}void RightShift2(int *arr, int N, int k){ k %= N; Reverse(arr, 0, N-k-1); Reverse(arr, N-k, N-1); Reverse(arr, 0, N-1);}// 数组的循环移位#include <cstdio>int gcd(int m, int n) {if(n==0) return m; return gcd(n,m%n);}void RightShift3(int a[],int n,int k){ k=n-(k%n);//右移k位 等价于左移-k位,-k = n - k(mod n) for(int i=0,len=gcd(n-k,k);i<len;i++){ int t=a[i],p=i,j=(i+k)%n; while(j!=i){ a[p]=a[j],p=j,j=(p+k)%n; } a[p]=t; }}void RightShift4(int a[],int n,int k){ k=(k%n);//leftshift for(int i=0,len=gcd(n-k,k);i<len;i++){ int t=a[i],p=i,j=(i+k)%n; while(j!=i){ a[p]=a[j],p=j,j=(j+k)%n; } a[p]=t; }}void printArray(int A[], int n) {for(int i = 0; i < n; i++) {printf("%-3d", A[i]);}printf("\n");}int main() {int A[] = {1,2,3,4,5,6,7};RightShift4(A, 7, 1);printArray(A, 7);RightShift3(A, 7, 2);printArray(A, 7);RightShift2(A, 7, 3);printArray(A, 7);RightShift1(A, 7, 5);printArray(A, 7);return 0;}
参考资料 1.王晓东 《算法设计与分析》第三版
0 0
- 数组循环位移 三种
- 数组循环位移
- java数组循环位移
- [Java]数组循环位移
- 数组循环位移
- 循环位移
- 循环位移
- 数组位移
- 数组位移的几种指针使用法
- 循环位移-C
- 循环位移-C
- 循环位移二进制数
- C语言实现 循环位移
- 使用三种循环遍历ArrayList类型数组。
- 迭代器循环数组和遍历Map的三种方式
- c语言循环位移(数字,字符串)
- 右位移循环操作的实现
- 三种循环语句
- hdu 1815 2-SAT经典题
- 采用全文索引解决模糊查询速度慢的问题
- 软件工程概念
- 移动webapp前端开发小结
- leetcode Intersection of Two Linked Lists
- 数组循环位移 三种
- fbd2fbs过采样转换的问题
- TQ2440 学习笔记—— 9、嵌入式编程基础知识【arm-linux-gcc 选项】
- eclipse从数据库逆向生成Hibernate实体类
- snprintf函数使用
- fiddle android
- Ubuntu CUDA 环境配置
- hdu3911 Black And White(线段树区间合并)
- 使用Navicat for Oracle新建表空间、用户及权限赋予