Advertisement
TyagoTeoi

bucketsort

Nov 13th, 2019
355
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.21 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define max 1000
  5.  
  6. void bucket_sort(int v[],int tam);
  7. void bubble(int v[],int tam);
  8. int countSetBits(int n);
  9.  
  10. int countSetBits(int n)
  11. {
  12. int count = 0;
  13. while (n) {
  14. count += n & 1;
  15. n >>= 1;
  16. }
  17. return count;
  18. }
  19.  
  20. void bucket_sort(int v[], int tam){
  21.  
  22. int i, j, k;
  23.  
  24. typedef struct {
  25. int topo;
  26. int balde[tam];
  27. }bucket;
  28.  
  29. bucket b[9]; //Como a entrada máxima é 1000, o número de bits 1 é 9 (111111111 na base 2 = 511 na base 10)
  30.  
  31. for(i = 0; i < 9; i++)
  32. b[i].topo = 0;
  33.  
  34. for(i = 0; i < tam; i++){
  35. j = countSetBits(v[i]); //"countSetBits() verifica quantos bits tem o valor da posição "i" do vetor "v" e atribui esse valor em "j".
  36. b[j].balde[b[j].topo] = v[i]; //O valor de j é posto na posição j do vetor bucket "b", que representa o balde com a quantidade de bits j.
  37. (b[j].topo)++; //O topo da posição j do balde é atualizado.
  38.  
  39. }
  40.  
  41. for(i = 0; i < 9; i++) //Cada balde é ordenado com o bubblesort, uma vez que, teoricamente, são poucos elementos e distam muito pouco em módulo
  42. if(b[i].topo) //um do outro.
  43. bubble(b[i].balde, b[i].topo);
  44.  
  45. for ( i = 0; i < 9; i++) {
  46. for ( j = 0; j < b[i].topo; j++) //Todos os elementos dos baldes (caso topo não seja igual a 0) são impressos.
  47. printf("%d ", b[i].balde[j]);
  48. if ( b[i].topo != 0 && i != tam)
  49. printf("\n");
  50. }
  51.  
  52. i=0;
  53.  
  54. for(j = 0; j < 9; j++){ //O vetor v recebe o conteúdo dos baldes, que representam 0 até 9 bits 1, caso o balde não esteja vazio.
  55. for(k = 0; k < b[j].topo; k++){
  56. v[i] = b[j].balde[k];
  57. i++;
  58. }
  59. }
  60.  
  61. bubble(v, tam); /*Como nesse caso, para um bucket de x bits, pode conter números que diferem consideravelmente em módulo
  62. (por exemplo, tanto o número 1 quanto o número 64 possuem o bit 1 uma vez apenas) a função do bubble sorte é chamada ao final
  63. da concatenação dos buckets, uma vez que o vetor está praticamente já ordenado.*/
  64. }
  65.  
  66. void bubble(int v[],int tam){
  67. int i,j,temp,flag;
  68. if(tam)
  69. for(j=0;j<tam-1;j++){
  70. flag=0;
  71. for(i=0;i<tam-1;i++){
  72. if(v[i+1]<v[i]){
  73. temp=v[i];
  74. v[i]=v[i+1];
  75. v[i+1]=temp;
  76. flag=1;
  77. }
  78. }
  79. if(!flag)
  80. break;
  81. }
  82. }
  83.  
  84.  
  85.  
  86. void imprimir_vetor(int *v, int n) {
  87. int i;
  88. for (i = 0; i < n; i++) {
  89. printf("%d ", v[i]);
  90. }
  91. }
  92.  
  93. int main() {
  94. int n, i;
  95.  
  96. scanf("%d", &n);
  97.  
  98. if (n > max)
  99. exit(1);
  100.  
  101. int *x = (int*) malloc (n * sizeof(int));
  102. if (x == NULL) {
  103. printf("Memoria insuficiente para alocar o vetor de %d posicoes.\n", n);
  104. exit(1);
  105. }
  106.  
  107. for (i = 0; i < n; i++)
  108. scanf("%d", &x[i]);
  109.  
  110. bucket_sort(x, n);
  111.  
  112. imprimir_vetor(x, n);
  113.  
  114. free(x);
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement