Johnson trotter置换算法代码
Johnson trotter permutation algorithm code in C++ language
我正试图在C++中实现Johnson trotter,但我被正常排列卡住了。我不想使用向量,也不想创建一个类来解决这个问题。
有人能帮助实现这个C++吗?
void swap(int x, int y)
{
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
return;
}
void print(int s)
{
for (int i = 0; i<s; i++)
cout << arr[i] << " ";
cout << endl;
return;
}
void permute(int k, int s)
{
if (k == 0)
print(s);
else
{
for (int i = k - 1; i >= 0; i--)
{
swap(i, k - 1);
permute(k - 1, s);
swap(i, k - 1);
}
}
}
int num(int x)
{
int j = 0;
if (x == 0)
j = 1;
else
j = x*(num(x - 1));
return j;
}
我在这里对Trotter的算法有了清晰的理解:https://youtu.be/xsFKorZ95Yw.
我创建了一个矢量来表示数字的方向,-1表示左方向,1表示右方向。在这个实现中,我按升序对元素进行排序,并使用-1作为初始方向。
template <typename T>
std::vector<int> PreparePermutation(std::vector<T>& input) {
std::sort(input.begin(), input.end());
std::vector<int> directions(input.size(), -1);
return directions;
}
template <typename T>
bool NextPermutation(std::vector<T>& input, std::vector<int>& directions) {
// position of max mobile number
int max_mobile_pos = -1;
for (int i = 0; i < input.size(); ++i) {
// i - 1 or i + 1 to get left or right element it points to
int pointed_pos = i + directions[i];
// an element is mobile if it is larger than the element it points to
if (pointed_pos >= 0 && pointed_pos < input.size() &&
input[i] > input[pointed_pos]) {
// find largest mobile element
if (max_mobile_pos < 0 || input[i] > input[max_mobile_pos]) {
max_mobile_pos = i;
}
}
}
if (max_mobile_pos == -1) {
return false;
}
auto max_mobile_pointed_pos = max_mobile_pos + directions[max_mobile_pos];
std::swap(input[max_mobile_pos], input[max_mobile_pointed_pos]);
std::swap(directions[max_mobile_pos], directions[max_mobile_pointed_pos]);
max_mobile_pos = max_mobile_pointed_pos;
for (int i = 0; i < input.size(); ++i) {
// flip direction of elements larger than current max mobile
if (input[i] > input[max_mobile_pos]) {
directions[i] *= -1;
}
}
return true;
}
相关文章:
- 读取最后一行代码算法 - c++ 时出现问题
- 如何将 c++ get 函数代码转换为 opencv 算法中使用的 python
- 如何知道用于实现标准代码段的确切数据结构和算法,例如在C++STL中?
- 由于指针算法错误,代码在 memcpy 中崩溃
- 为什么此代码上的排序算法不调用类的交换版本?
- 对于代码中指定的边界之外的值,对角差算法的输入不正确
- "使用算法;不要为多步骤逻辑编写代码"?
- 这条代码线在双方图算法中通过BFS做什么
- 带有 std::vector 和 std::queue 的 Prim's 算法,我的代码有什么问题?
- 尝试在C++中"blur"矩阵;有缺陷的算法或代码?
- C - 哈希算法代码什么都没有返回
- 在避免代码重复和冲突名称的同时,如何实现多个版本的同一算法
- C++算法:如何提高此代码的效率?[大O]
- 我需要一个测试案例来证明我的算法/代码错误
- 快速排序算法代码
- Johnson trotter置换算法代码
- 克鲁斯卡尔算法代码因未知原因而崩溃
- 分离配置代码和算法代码的最佳做法
- 以下 Prim 算法代码的运行时间
- 排序算法代码中的未知问题