数组循环位移 三种
2015-09-01 10:02
274 查看
#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.王晓东 《算法设计与分析》第三版
相关文章推荐
- JSONObject遍历获取键值
- 问题解决——maven出现“Dynamic Web Module 3.0 requires Java 1.6 or newer.”错误
- visual studio 2008试用版破解v
- LeetCode之Isomorphic Strings
- 归并排序,递归与非递归
- Perl 正则表达式
- JavaScript 类定义常用方法(转)
- js收藏网页
- 使用Navicat for Oracle新建表空间、用户及权限赋予
- 鲁大师怎么查看cpu风扇转速|用鲁大师查看cpu风扇转速的方法
- 开发者常用的10个插件
- fiddle android
- DevExpress v15.1:Dashboard控件升级
- 剑指Offer面试题5:从尾到头打印链表
- 用VS2013在win7下编写的C++程序怎么在XP下运行?
- TCP协议三次握手连接四次握手断开和DOS攻击
- mysql check constraint doesn't work
- android:baselineAligned="false"
- html页面倒计时
- python调用Go代码