Ir para conteúdo

Cartilho

Members
  • Total de itens

    1
  • Registro em

  • Última visita

Posts postados por Cartilho


  1. Ao executar o meu .cpp ele tem feito tudo corretamente com todos os metodos, menos o radix, ele tem q calcular os tempos e fazer a media depois, ele não tem feito isso com o radix e não sei oq fazer, preciso muito de ajuda e uma solução, ja tentei de tudo, mas não sou bom em C++.

     

    link para ver funcionando: https://www.onlinegdb.com/fork/rkRmSLk24

     

    #include <stdio.h>
    #include <time.h>
    #include <stdlib.h>
    #include <limits.h>
    #include <string.h>
    #include <chrono>
    #include <unistd.h>
    #include <iostream>
    
    using namespace std;
    
    int *v, *v1, *v2, *v3, *v4, *v5, *v6, *v7;
    
    //-------------------------------------------------------------------------------------
    void bubbleSort(int v[], int n)
    {
        bool trocou;
        int k = n;
    
        do {
          trocou = false;
          k--;
          for (int i = 0; i < k; i++)
            if (v[i+1] < v[i]) {
              int aux = v[i+1];
              v[i+1] = v[i];
              v[i] = aux;
              trocou = true;
            }
        } while (trocou);
    }
    
    //-------------------------------------------------------------------------------------
    void insertionSort(int v[], int n)
    {
        int i, j, chave;
        for (j = 1; j < n; j++) {
            chave = v[j];
            i = j - 1;
            while (i >= 0 && v[i] > chave) {
                v[i+1] = v[i];
                i--;
            }
            v[i+1] = chave;
        }
    }
    
    //-------------------------------------------------------------------------------------
    void selectionSort(int v[], int n)
    {
      int i, j, min;
    
      for(i = 0; i < n-1; i++) {
        min = i;
        for (j = i + 1; j < n; j++)
          if (v[j] < v[min])
            min = j;
    
        if (min != i) {
          int temp = v[min];
          v[min] = v[i];
          v[i] = temp;
        }
      }
    }
    
    //-------------------------------------------------------------------------------------
    void shellSort(int v[], int n)
    {
        int i , j , valor;
        int h = 1;
        while(h < n) {
            h = 3*h+1;
        }
        while (h > 1) {
            h /= 3;
            for(i = h; i < n; i++) {
                valor = v[i];
                j = i - h;
                while (j >= 0 && valor < v[j]) {
                    v [j + h] = v[j];
                    j -= h;
                }
                v [j + h] = valor;
            }
        }
    }
    
    //-------------------------------------------------------------------------------------
    void quickSort1(int v[], int ini, int fim)
    {
        int i = ini;
        int j = fim;
        int pivo = v[(ini+ fim)/2];  // Pivo e o elemento central
    
        do
        {
            while (v[i] < pivo && i < fim)
                i++;
            while (pivo < v[j] && j > ini)
                j--;
            if (i <= j)
            {
                int aux = v[i];
                v[i] = v[j];
                v[j] = aux;
                i++;
                j--;
            }
        } while (i <= j);
    
        if (ini < j)
            quickSort1(v,ini,j);
        if (i < fim)
            quickSort1(v,i,fim);
    }
    
    void quickSort(int v[], int tam)
    {
        quickSort1(v, 0, tam-1);
    }
    
    //-------------------------------------------------------------------------------------
    void intercala(int v[], int aux[], int ini, int meio, int fim)
    {
        int i = ini, j = fim, k;
    
        for (k = ini; k <= meio; k++)
            aux[k] = v[k];
    
        for (k = meio+1; k <= fim; k++)
            aux[fim + meio + 1 - k] = v[k];
    
        for (k = ini; k <= fim; k++)
            if (aux[i] <= aux[j])
                v[k] = aux[i++];
            else
                v[k] = aux[j--];
    }
    
    void mergeSort1(int v[], int aux[], int ini, int fim)
    {
        if (ini < fim) {
            int meio = (ini + fim) / 2;
            mergeSort1(v, aux, ini, meio);
            mergeSort1(v, aux, meio+1, fim);
            intercala(v, aux, ini, meio, fim);
        }
    }
    
    void mergeSort(int v[], int n)
    {
        int *aux = (int *) malloc(n * sizeof(int));
    
        mergeSort1(v, aux, 0, n-1);
    
        free(aux);
    }
    
    //-------------------------------------------------------------------------------------
    int getMax(int v[], int tam)
    {
        int max = v[0];
        for (int i = 1; i < tam; i++)
            if (v[i] > max)
                max = v[i];
        return max;
    }
    
    void countSort(int v[], int tam, int exp)
    {
        int output[tam], i, count[10] = {0};
    
        for (i = 0; i < tam; i++)
            count[(v[i] / exp) % 10]++;
    
        for (i = 1; i < 10; i++)
            count[i] += count[i-1];
    
        for (i = tam - 1; i >= 0; i--)
        {
            output[count[(v[i] / exp) % 10] - 1] = v[i];
            count[(v[i] / exp) % 10]--;
        }
    
        for (i = 0; i < tam; i++)
            v[i] = output[i];
    }
    
    void radixsort(int v[], int tam)
    {
    	int exp, m;
    	m = getMax(v, tam);
    
    	for (exp = 1; m/exp > 0; exp *= 10)
    		countSort(v, tam, exp);
    }
    
    //-------------------------------------------------------------------------------------
    void gerar(int v[], int tam)
    {
        srand((unsigned int)time(NULL));
    
        for (int i = 0; i < tam; i++)
            v[i] = rand() % 100000001;
    }
    
    //-------------------------------------------------------------------------------------
    void copiar(int origem[], int destino[], int n)
    {
        for (int i = 0; i < n; i++)
            destino[i] = origem[i];
    }
    
    //-------------------------------------------------------------------------------------
    bool verifica(int v[], int n)
    {
        for (int i = 0; i < n-1; i++)
            if (v[i] > v[i+1])
                return false;
    
        return true;
    }
    
    //-------------------------------------------------------------------------------------
    void inverte(int v[], int n)
    {
        for (int i = 0, j = n-1; i < n/2; i++,j--)
            v[i] = v[j];
    }
    
    //-------------------------------------------------------------------------------------
    int main(void)
    {
        chrono::steady_clock::time_point start, end;
        long double cpu_time;
        int tam, iter;
        char metodos[100];
        long double tempo[] = { 0, 0, 0, 0, 0, 0 };
    
        tam = 0;
        printf("Quantos numeros? ");
        scanf("%d", &tam);
        getchar();
    
        if (tam <= 0)
            return 0;
    
        printf("Selecione os metodos:\n  1-Bubble sort\n  2-Selection sort\n  3-Insertion sort\n  4-Shell sort\n  5-Quicksort\n  6-Mergesort\n  7-Radix sort\nMetodos: ");
        gets(metodos);
    
        printf("Quantas execucoes (1, 2, 3, ...)? ");
        scanf("%d", &iter);
        getchar();
    
        if (iter <= 0)
            return 0;
    
        v  = (int *) malloc(tam * sizeof(int));
        v1 = (int *) malloc(tam * sizeof(int));
        v2 = (int *) malloc(tam * sizeof(int));
        v3 = (int *) malloc(tam * sizeof(int));
        v4 = (int *) malloc(tam * sizeof(int));
        v5 = (int *) malloc(tam * sizeof(int));
        v6 = (int *) malloc(tam * sizeof(int));
        v7 = (int *) malloc(tam * sizeof(int));
    
        for (int i = 1; i <= iter; i++) {
            printf("------------------------------------------------\nExecucao %d:\n------------------------------------------------\n", i);
    
            printf("Gerando %d elementos...\n", tam);
            gerar(v, tam);
            copiar(v, v1, tam);
            copiar(v, v2, tam);
            copiar(v, v3, tam);
            copiar(v, v4, tam);
            copiar(v, v5, tam);
            copiar(v, v6, tam);
            copiar(v, v7, tam);
    
            // bubble
            if (strchr(metodos, '1') != NULL) {
                printf("Bubble sort...\n");
    
                start = chrono::steady_clock::now();
    
                bubbleSort(v1, tam);
    
                end = chrono::steady_clock::now();
    
                cpu_time = chrono::duration_cast<chrono::nanoseconds>(end - start).count() / (long double) 1000000.0;
    
                printf("%s. Tempo: %lf ms (%lf s)\n", verifica(v1, tam) ? "OK":"ERRO", cpu_time, cpu_time/1000);
    
                tempo[0] += cpu_time;
            }
    
            // selection
            if (strchr(metodos, '2') != NULL) {
                printf("Selection sort...\n");
                start = chrono::steady_clock::now();
    
                selectionSort(v3, tam);
    
                end = chrono::steady_clock::now();
    
                cpu_time = chrono::duration_cast<chrono::nanoseconds>(end - start).count() / (long double) 1000000.0;
    
                printf("%s. Tempo: %lf ms (%lf s)\n", verifica(v3, tam) ? "OK":"ERRO", cpu_time, cpu_time/1000);
    
                tempo[1] += cpu_time;
            }
    
            // insertion
            if (strchr(metodos, '3') != NULL) {
                printf("Insertion sort...\n");
    
                start = chrono::steady_clock::now();
    
                insertionSort(v2, tam);
    
                end = chrono::steady_clock::now();
    
                cpu_time = chrono::duration_cast<chrono::nanoseconds>(end - start).count() / (long double) 1000000.0;
    
                printf("%s. Tempo: %lf ms (%lf s)\n", verifica(v2, tam) ? "OK":"ERRO", cpu_time, cpu_time/1000);
    
                tempo[2] += cpu_time;
            }
    
    
            // shell
            if (strchr(metodos, '4') != NULL) {
                printf("Shell sort...\n");
    
                start = chrono::steady_clock::now();
    
                shellSort(v4, tam);
    
                end = chrono::steady_clock::now();
    
                cpu_time = chrono::duration_cast<chrono::nanoseconds>(end - start).count() / (long double) 1000000.0;
    
                printf("%s. Tempo: %lf ms (%lf s)\n", verifica(v4, tam) ? "OK":"ERRO", cpu_time, cpu_time/1000);
    
                tempo[3] += cpu_time;
            }
    
            // quick
            if (strchr(metodos, '5') != NULL) {
                printf("Quick sort...\n");
    
                start = chrono::steady_clock::now();
    
                quickSort(v5, tam);
    
                end = chrono::steady_clock::now();
    
                cpu_time = chrono::duration_cast<chrono::nanoseconds>(end - start).count() / (long double) 1000000.0;
    
                printf("%s. Tempo: %lf ms (%lf s)\n", verifica(v5, tam) ? "OK":"ERRO", cpu_time, cpu_time/1000);
    
                tempo[4] += cpu_time;
            }
    
            // merge
            if (strchr(metodos, '6') != NULL) {
                printf("Merge sort...\n");
    
                start = chrono::steady_clock::now();
    
                mergeSort(v6, tam);
    
                end = chrono::steady_clock::now();
    
                cpu_time = chrono::duration_cast<chrono::nanoseconds>(end - start).count() / (long double) 1000000.0;
    
                printf("%s. Tempo: %lf ms (%lf s)\n", verifica(v6, tam) ? "OK":"ERRO", cpu_time, cpu_time/1000);
    
                tempo[5] += cpu_time;
            }
    
            //radixsort
            if (strchr(metodos, '7') != NULL) {
                printf("Radix sort...\n");
    
                start = chrono::steady_clock::now();
    
                radixsort(v7, tam);
    
                end = chrono::steady_clock::now();
    
                cpu_time = chrono::duration_cast<chrono::nanoseconds>(end - start).count() / (long double) 1000000.0;
    
                printf("%s. Tempo: %lf ms (%lf s)\n", verifica(v7, tam) ? "OK":"ERRO", cpu_time, cpu_time/1000);
    
                tempo[6] += cpu_time;
            }
        }
    
        if (iter > 1) {
            printf("-------------------------------------------\nTempos medios:\n");
            if (strchr(metodos, '1') != NULL)
                printf("Bubble sort:    %lf ms (%lf s)\n", tempo[0]/iter, tempo[0]/(iter*1000));
            if (strchr(metodos, '2') != NULL)
                printf("selection sort: %lf ms (%lf s)\n", tempo[1]/iter, tempo[1]/(iter*1000));
            if (strchr(metodos, '3') != NULL)
                printf("Insertion sort: %lf ms (%lf s)\n", tempo[2]/iter, tempo[2]/(iter*1000));
            if (strchr(metodos, '4') != NULL)
                printf("Shell sort:     %lf ms (%lf s)\n", tempo[3]/iter, tempo[3]/(iter*1000));
            if (strchr(metodos, '5') != NULL)
                printf("Quick sort:     %lf ms (%lf s)\n", tempo[4]/iter, tempo[4]/(iter*1000));
            if (strchr(metodos, '6') != NULL)
                printf("Merge sort:     %lf ms (%lf s)\n", tempo[5]/iter, tempo[5]/(iter*1000));
            if (strchr(metodos, '7') != NULL)
                printf("Radix sort:     %lf ms (%lf s)\n", tempo[6]/iter, tempo[6]/(iter*1000));
        }
    
        free(v);
        free(v1);
        free(v2);
        free(v3);
        free(v4);
        free(v5);
        free(v6);
        free(v7);
    }

     

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.