按周期排列
Permutation by cycle
我正在尝试编写一个排列数组的函数。
但是,每当offset
大于零时,其中一个元素不会被A[i]
替换,我只剩下默认的初始化值。我似乎无法弄清楚问题出在哪里。代码中的fill
和print
函数只是用随机元素填充数组并打印数组的函数。
#include <iostream>
#include "print.h"
#include "random.h"
#include <memory>
int* permute_by_cycle(int A[], int size)
{
int dest;
int* C = new int[size];
int last = size - 1;
int offset = random(0, last);
std::cout << "offset = " << offset << std::endl;
for(int i = 0; i < size; i++) {
dest = i + offset;
//std::cout << "dest = " << dest << "tlast = " << last << std::endl;
if(dest > last)
dest -= last;
C[dest] = A[i];
}
return C;
}
int main()
{
int size = 18;
int A[size];
//int* B = new int[size];
fill(A,size);
print(A,size);
int* B = permute_by_cycle(A, size);
print(B,size);
delete [] B;
return 0;
}
输出:
41 65 31 41 19 15 72 11 78 69 37 23 29 63 75 4 5 49
offset = 16
0 31 41 19 15 72 11 78 69 37 23 29 63 75 4 5 49 65
替换
if(dest > last)
dest -= last;
跟:
if(dest > last)
dest -= size;
应使用 modulo
运算符来管理循环访问。我的首选版本是:
for(int i = 0; i < size; i++) {
C[(i+offset)%size] = A[i];
}
这样,您可以删除dest
和所有相关容易出错的行:)
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么不;名字在地图上是按顺序排列的吗
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 找到具有最多子串栅栏的字符串排列
- 重新排列单线以形成闭合多边形?
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 输入的 C++ 排列
- 公共/私有/受保护是否会更改内存中结构的排列?
- 如何在 C/C++ 中生成具有 n 组 5 个值(重复项)的所有可能排列的矩阵
- 在向量C++中排列奇数和偶数
- 如何进行排列?
- 矩阵行求和与 RowMajor 和 ColMajor 数据排列的奇怪性能差异
- 在 CPP 中打印具有重复项的选定长度字符的所有排列
- Pisano 周期生成器在 3 位周期内行为不正确
- 如何在不使用 C++ 中的数组或函数的情况下查找 N 位数字的所有排列
- 调用参数排列不变函数 f(i++, i++)
- 以 C++ 为单位具有输出限制的排列
- 在C++中寻找排列和组合
- 按周期排列