按周期排列

Permutation by cycle

本文关键字:排列 周期      更新时间:2023-10-16

我正在尝试编写一个排列数组的函数。

但是,每当offset大于零时,其中一个元素不会被A[i]替换,我只剩下默认的初始化值。我似乎无法弄清楚问题出在哪里。代码中的fillprint函数只是用随机元素填充数组并打印数组的函数。

#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和所有相关容易出错的行:)