bcribas / benchmark-ordenacao

Benchmark simples para algoritmos de ordenação. Envolve conteúdo da disciplina EDA-2 da UnB/FGA
GNU General Public License v2.0
76 stars 15 forks source link

RadixSort #6

Closed bcribas closed 3 years ago

bcribas commented 3 years ago

Precisamos de uma implementação do RadixSort. Quem pode contribuir?

ErickMVdO commented 3 years ago

Uma tentativa minha. Todos os casos de teste que eu fiz passaram, mas não tenho certeza se existe algum que quebra.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void radixSort(int *v, int n){

    int aux, aux1;

    for(int j=0; j<10; j++){
      int z=0,u=0,d=0,t=0,q=0,c=0,s=0,st=0,o=0,nv=0;

    int *zero = malloc(n*sizeof(int));
    int *um = malloc(n*sizeof(int));
    int *dois = malloc(n*sizeof(int));
    int *tres = malloc(n*sizeof(int));
    int *quatro = malloc(n*sizeof(int));
    int *cinco = malloc(n*sizeof(int));
    int *seis = malloc(n*sizeof(int));
    int *sete = malloc(n*sizeof(int));
    int *oito = malloc(n*sizeof(int));
    int *nove = malloc(n*sizeof(int));

        int k=0, l=0, zeroso=0;
        aux1 = pow(10,j);
        aux = pow(10,j+1);

    // Dividindo os valores de acordo com a casa de unidade/dezena/...
    for(int i=0; i<n; i++){

        if(v[i]==0){
          zeroso++;
          k++;
        }  
        else if(((v[i]%aux)/aux1)==0){
            zero[z]=v[i];
            z++;
            k++;
        }
        else if(((v[i]%aux)/aux1)==1){
            um[u]=v[i];
            u++;
            k++;
        }
        else if(((v[i]%aux)/aux1)==2){
            dois[d]=v[i];
            d++;
            k++;
        }
        else if(((v[i]%aux)/aux1)==3){
            tres[t]=v[i];
            t++;
            k++;
        }
        else if(((v[i]%aux)/aux1)==4){
            quatro[q]=v[i];
            q++;
            k++;
        }
        else if(((v[i]%aux)/aux1)==5){
            cinco[c]=v[i];
            c++;
            k++;
        }
        else if(((v[i]%aux)/aux1)==6){
            seis[s]=v[i];
            s++;
            k++;
        }
        else if(((v[i]%aux)/aux1)==7){
            sete[st]=v[i];
            st++;
            k++;
        }
        else if(((v[i]%aux)/aux1)==8){
            oito[o]=v[i];
            o++;
            k++;
        }
        else if(((v[i]%aux)/aux1)==9){
            nove[nv]=v[i];
            nv++;
            k++;
        }
    }

    // Reagrupando os vetores que estão divididos
    for(int i=0; i<zeroso && zeroso!=0; i++){
      v[l]=0;
      l++;
    }
    for(int i=0; zero[i]!='\0'; i++){
      v[l]=zero[i];
      l++;
    }
    for(int i=0; um[i]!='\0'; i++){
      v[l]=um[i];
      l++;
    }
    for(int i=0; dois[i]!='\0'; i++){
      v[l]=dois[i];
      l++;
    }
    for(int i=0; tres[i]!='\0'; i++){
      v[l]=tres[i];
      l++;
    }
    for(int i=0; quatro[i]!='\0'; i++){
      v[l]=quatro[i];
      l++;
    }
    for(int i=0; cinco[i]!='\0'; i++){
      v[l]=cinco[i];
      l++;
    }
    for(int i=0; seis[i]!='\0'; i++){
      v[l]=seis[i];
      l++;
    }
    for(int i=0; sete[i]!='\0'; i++){
      v[l]=sete[i];
      l++;
    }
    for(int i=0; oito[i]!='\0'; i++){
      v[l]=oito[i];
      l++;
    }
    for(int i=0; nove[i]!='\0'; i++){
      v[l]=nove[i];
      l++;
    }
    if(k==0){
        j=10;
    }
    }
} 
bcribas commented 3 years ago

Erick, Mande o PULL REQUEST desta sua implementação. E se possível (mas não obrigatório) as modificações no Makefile e main.h para usar a sua implementação serão bem vindas.

Um teste legal para você fazer é enviar a sua solução para os exercícios da lista de ordenação elementar.

[]s

bcribas commented 3 years ago

resolvido no commit https://github.com/bcribas/benchmark-ordenacao/commit/a361625b790c55ac9dbc887f65a269719553e1eb