Advertisement
Guest User

BIT INDEX SORT

a guest
Sep 20th, 2014
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.01 KB | None | 0 0
  1. /*BIT INDEX SORT*/
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #define N 32
  6.  
  7. int busca_repetidos(int E[], int n) {
  8.     int i, j;
  9.     for (i = 0; i < n; i++) {
  10.         for (j = i + 1; j < n; j++) {
  11.             if (E[i] == E[j])
  12.                 return 0;
  13.         }
  14.     }
  15.     return 1;
  16. }
  17.  
  18. int cpdelante(unsigned int bit) {
  19.     int i;
  20.     int cont = 0;
  21.     //Se contarán los ceros de la izquierda del 1 más significativo
  22.     for (i = 0; i < 32; i++) {
  23.         if ((bit & 1) == 1) //Si se encuentra un 1 más a la derecha
  24.             cont = 0; //se contará de nuevo    
  25.         else
  26.             cont++;
  27.         bit = bit >> 1; //Se mueven los bits a la derecha
  28.     }
  29.     return cont;
  30. }
  31.  
  32. void bit_index_dsc(int E[], int n) {
  33.  
  34.     unsigned int B[N] = {0};
  35.  
  36.     int ind = 0; //index (indice)    
  37.     int off = 0; //offset (desplazamiento))
  38.  
  39.     //Etapa de clasificacion
  40.     int i;
  41.     for (i = 0; i < N; i++) {
  42.         ind = E[i] / 32;
  43.         off = E[i] % 32;
  44.         B[ind] |= B[i] | (1 << off);
  45.     }
  46.  
  47.     //Etapa de recuperación
  48.     int j;
  49.     i = 0;
  50.     for (j = (N - 1); j >= 0; j--) {
  51.         while (B[j] > 0) {
  52.             off = 31 - cpdelante(B[j]);
  53.             E[i] = j * 32 + off;
  54.             B[j] -= (1 << off);
  55.             i++;
  56.         }
  57.     }
  58. }
  59.  
  60. void imprime_ordenado(int E[], int n) {
  61.     int i;
  62.     for (i = 0; i < n; i++) {
  63.         printf("%d ", E[i]);
  64.     }
  65.     printf("\n");
  66. }
  67.  
  68. int main(int argc, char** argv) {
  69.     int n = -1;
  70.  
  71.     int E[N] = {0};
  72.  
  73.     while (n) {
  74.         printf("Ingrese el numero de datos del arreglo:\n");
  75.  
  76.         scanf("%d", &n);
  77.  
  78.         if (n > 0) {
  79.             printf("Ingrese los valores a ordenar:\n");
  80.  
  81.             int i;
  82.             for (i = 0; i < n; i++)
  83.                 scanf("%d", &E[i]);
  84.  
  85.             if (busca_repetidos(E, n)) {
  86.                 bit_index_dsc(E, n);
  87.                 imprime_ordenado(E, n);
  88.             } else
  89.                 printf("Hay valores repetidos\n");
  90.         }
  91.     }
  92.     return (EXIT_SUCCESS);
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement