2013-09-19 5 views
1

Я пытаюсь написать функцию, которая переставляет массив.Перестановка по циклу

Однако, если 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 
+2

Вы пробовали 'зЬй :: next_permutation'? Может быть полезно (если вы просто не хотите реализовать алгоритм, конечно). – Aleph

+0

Нет, нет. Я пытался реализовать алгоритм, но я также посмотрю на это. – Ares

ответ

2

заменить

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 и все связанные с ним подверженные ошибкам линии :)

Смежные вопросы