Advertisement
Guest User

fisher-yates shuffle

a guest
Jan 15th, 2011
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.67 KB | None | 0 0
  1. /*
  2. Fisher–Yates shuffle, Knuth shuffle (Durstenfeld's Solution)
  3. Autor:
  4.     Ronald Fisher, Frank Yattes, Donald Knuth, Richard Durstenfeld
  5. Colaborador:
  6.     Anderson "Cacovsky" Marques Ferraz
  7.     amarquesferraz@gmail.com
  8. Tipo:
  9.     sorting
  10. Descrição:
  11.     Embaralha um vetor de numeros sequenciais. Nao utiliza nenhum vetor
  12.     auxiliar (in-place) e so realiza tantos sorteios quanto posicoes do
  13.     vetor.
  14. Complexidade:
  15.     O(n)
  16. Dificuldade:
  17.     medio
  18. Referências:
  19.     http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
  20. Licenca:
  21.     LGPL
  22. */
  23.  
  24.  
  25.  
  26. #include <cstdio>
  27. #include <cstdlib>
  28. #include <ctime>
  29.  
  30. /**
  31.   * gera uma lista ordenada
  32.   */
  33. int * gera_vetor_ordenado(int qtde_elementos)
  34. {
  35.     int *resultado= (int*) malloc(qtde_elementos*sizeof(int));
  36.  
  37.     for (int i=0; i<qtde_elementos; i++) resultado[i] = i;
  38.  
  39.     return resultado;
  40. }
  41.  
  42.  
  43. void imprime_vetor(int *vetor, int qtde_elementos )
  44. {
  45.     for (int i=0; i<qtde_elementos; i++) printf("%d ", vetor[i]);
  46.  
  47.     printf("\n");
  48. }
  49.  
  50.  
  51.  
  52. int main()
  53. {
  54.  
  55.     //setup
  56.     int N = 10;
  57.     int *elementos = gera_vetor_ordenado(N); //passo 1
  58.     srand ( time(NULL) ); //inicializando a seed
  59.  
  60.  
  61.     printf("Vetor ordenado: ");
  62.     imprime_vetor(elementos, N);
  63.  
  64.     //core
  65.     int elementos_restantes = N;
  66.     while (elementos_restantes>0){
  67.         int k = rand() % (elementos_restantes); //passo 2
  68.  
  69.         //passo 3
  70.         int tmp = elementos[k];
  71.         elementos[k] = elementos[elementos_restantes-1];
  72.         elementos[elementos_restantes-1] = tmp;
  73.  
  74.         elementos_restantes--; //passo 4
  75.     }
  76.  
  77.     printf("Vetor embaralhado: ");
  78.     imprime_vetor(elementos, N);
  79.  
  80.     return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement