From a9d6ed1d6a0bcd0e93e8c823c920c55376b6371a Mon Sep 17 00:00:00 2001 From: axell-brendow Date: Tue, 18 Aug 2020 14:05:41 -0300 Subject: [PATCH 1/2] =?UTF-8?q?Adapta=20algoritmos=20de=20ordena=C3=A7?= =?UTF-8?q?=C3=A3o=20em=20Java=20para=20C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../c/bolha.h | 8 +-- .../c/bolha_teste.c | 22 ++++--- .../c/countingsort.h | 39 ++++++++++++ .../c/geracao.h | 4 +- .../c/heapsort.h | 61 +++++++++++++++++++ .../c/insercao.h | 6 +- .../c/mergesort.h | 6 ++ .../c/quicksort.h | 26 ++++++++ .../c/selecao.h | 6 +- .../c/shellsort.h | 31 ++++++++++ 10 files changed, 189 insertions(+), 20 deletions(-) diff --git a/fonte/U4 - Ordenação em memória principal/c/bolha.h b/fonte/U4 - Ordenação em memória principal/c/bolha.h index 7e31d16..25ce7d2 100644 --- a/fonte/U4 - Ordenação em memória principal/c/bolha.h +++ b/fonte/U4 - Ordenação em memória principal/c/bolha.h @@ -1,6 +1,6 @@ - #ifndef BOLHA_H - #define BOLHA_H - //============================================================================= +#ifndef BOLHA_H +#define BOLHA_H +//============================================================================= #include "geracao.h" //============================================================================= void bolha(int *array, int n){ @@ -8,7 +8,7 @@ void bolha(int *array, int n){ for (i = (n - 1); i > 0; i--) { for (j = 0; j < i; j++) { if (array[j] > array[j + 1]) { - swap(&array[j], &array[j + 1]); + swap(&array[j], &array[j + 1]); } } } diff --git a/fonte/U4 - Ordenação em memória principal/c/bolha_teste.c b/fonte/U4 - Ordenação em memória principal/c/bolha_teste.c index 55f2f9c..62bc846 100644 --- a/fonte/U4 - Ordenação em memória principal/c/bolha_teste.c +++ b/fonte/U4 - Ordenação em memória principal/c/bolha_teste.c @@ -28,29 +28,35 @@ int main(int argc, char **argv) { comeco = clock(); bolha(array, n); fim = clock(); - total = (fim - comeco) / (double)CLOCKS_PER_SEC / 1000.0; + total = ((fim - comeco) / (double)CLOCKS_PER_SEC) * 1000.0; mostrar(array, n); - printf("Tempo para ordenar: %f ms (%i).", total, isOrdenado(array, n)); + printf("Tempo para ordenar: %f ms (%s).\n", + total, + isOrdenado(array, n) ? "ORDENADO" : "DESORDENADO"); - printf("Teste Bolha: Ordem Decrescente\n"); + printf("\nTeste Bolha: Ordem Decrescente\n"); decrescente(array, n); mostrar(array, n); comeco = clock(); bolha(array, n); fim = clock(); - total = (fim - comeco) / (double)CLOCKS_PER_SEC / 1000.0; + total = ((fim - comeco) / (double)CLOCKS_PER_SEC) * 1000.0; mostrar(array, n); - printf("Tempo para ordenar: %f ms (%i).", total, isOrdenado(array, n)); + printf("Tempo para ordenar: %f ms (%s).\n", + total, + isOrdenado(array, n) ? "ORDENADO" : "DESORDENADO"); - printf("Teste Bolha: Ordem Aleatoria\n"); + printf("\nTeste Bolha: Ordem Aleatoria\n"); aleatorio(array, n); mostrar(array, n); comeco = clock(); bolha(array, n); fim = clock(); - total = (fim - comeco) / (double)CLOCKS_PER_SEC / 1000.0; + total = ((fim - comeco) / (double)CLOCKS_PER_SEC) * 1000.0; mostrar(array, n); - printf("Tempo para ordenar: %f ms (%i).", total, isOrdenado(array, n)); + printf("Tempo para ordenar: %f ms (%s).\n", + total, + isOrdenado(array, n) ? "ORDENADO" : "DESORDENADO"); free(array); diff --git a/fonte/U4 - Ordenação em memória principal/c/countingsort.h b/fonte/U4 - Ordenação em memória principal/c/countingsort.h index e69de29..54fff02 100644 --- a/fonte/U4 - Ordenação em memória principal/c/countingsort.h +++ b/fonte/U4 - Ordenação em memória principal/c/countingsort.h @@ -0,0 +1,39 @@ +#ifndef COUNTINGSORT_H +#define COUNTINGSORT_H +//============================================================================= +#include "geracao.h" +//============================================================================= +int getMaior(int *array, int n) { + int maior = array[0]; + + for (int i = 0; i < n; i++) { + if(maior < array[i]){ + maior = array[i]; + } + } + return maior; +} +//============================================================================= +void countingsort(int *array, int n) { + //Array para contar o numero de ocorrencias de cada elemento + int tamCount = getMaior(array, n) + 1; + int count[tamCount]; + int ordenado[n]; + + //Inicializar cada posicao do array de contagem + for (int i = 0; i < tamCount; count[i] = 0, i++); + + //Agora, o count[i] contem o numero de elemento iguais a i + for (int i = 0; i < n; count[array[i]]++, i++); + + //Agora, o count[i] contem o numero de elemento menores ou iguais a i + for(int i = 1; i < tamCount; count[i] += count[i-1], i++); + + //Ordenando + for(int i = n-1; i >= 0; ordenado[count[array[i]]-1] = array[i], count[array[i]]--, i--); + + //Copiando para o array original + for(int i = 0; i < n; array[i] = ordenado[i], i++); +} +//============================================================================= +#endif \ No newline at end of file diff --git a/fonte/U4 - Ordenação em memória principal/c/geracao.h b/fonte/U4 - Ordenação em memória principal/c/geracao.h index 7e36b23..6889d8e 100644 --- a/fonte/U4 - Ordenação em memória principal/c/geracao.h +++ b/fonte/U4 - Ordenação em memória principal/c/geracao.h @@ -1,5 +1,5 @@ - #ifndef GERACAO_H - #define GERACAO_H +#ifndef GERACAO_H +#define GERACAO_H //============================================================================= #include #include diff --git a/fonte/U4 - Ordenação em memória principal/c/heapsort.h b/fonte/U4 - Ordenação em memória principal/c/heapsort.h index e69de29..398e354 100644 --- a/fonte/U4 - Ordenação em memória principal/c/heapsort.h +++ b/fonte/U4 - Ordenação em memória principal/c/heapsort.h @@ -0,0 +1,61 @@ +#ifndef HEAPSORT_H +#define HEAPSORT_H +//============================================================================= +#include "geracao.h" +//============================================================================= +void constroi(int *array, int tamHeap){ + for(int i = tamHeap; i > 1 && array[i] > array[i/2]; i /= 2){ + swap(array + i, array + i/2); + } +} +//============================================================================= +int getMaiorFilho(int *array, int i, int tamHeap){ + int filho; + if (2*i == tamHeap || array[2*i] > array[2*i+1]){ + filho = 2*i; + } else { + filho = 2*i + 1; + } + return filho; +} +//============================================================================= +void reconstroi(int *array, int tamHeap){ + int i = 1; + while(i <= (tamHeap/2)){ + int filho = getMaiorFilho(array, i, tamHeap); + if(array[i] < array[filho]){ + swap(array + i, array + filho); + i = filho; + }else{ + i = tamHeap; + } + } +} +//============================================================================= +void heapsort(int *array, int n) { + //Alterar o vetor ignorando a posicao zero + int arrayTmp[n+1]; + for(int i = 0; i < n; i++){ + arrayTmp[i+1] = array[i]; + } + // array = tmp; + + //Contrucao do heap + for(int tamHeap = 2; tamHeap <= n; tamHeap++){ + constroi(arrayTmp, tamHeap); + } + + //Ordenacao propriamente dita + int tamHeap = n; + while(tamHeap > 1){ + swap(arrayTmp + 1, arrayTmp + tamHeap--); + reconstroi(arrayTmp, tamHeap); + } + + //Alterar o vetor para voltar a posicao zero + for(int i = 0; i < n; i++){ + array[i] = arrayTmp[i+1]; + } +} +//============================================================================= +#endif \ No newline at end of file diff --git a/fonte/U4 - Ordenação em memória principal/c/insercao.h b/fonte/U4 - Ordenação em memória principal/c/insercao.h index bf8deea..2535121 100644 --- a/fonte/U4 - Ordenação em memória principal/c/insercao.h +++ b/fonte/U4 - Ordenação em memória principal/c/insercao.h @@ -1,6 +1,6 @@ - #ifndef INSERCAO_H - #define INSERCAO_H - //============================================================================= +#ifndef INSERCAO_H +#define INSERCAO_H +//============================================================================= #include "geracao.h" //============================================================================= void insercao(int *array, int n){ diff --git a/fonte/U4 - Ordenação em memória principal/c/mergesort.h b/fonte/U4 - Ordenação em memória principal/c/mergesort.h index e69de29..a3e3d1a 100644 --- a/fonte/U4 - Ordenação em memória principal/c/mergesort.h +++ b/fonte/U4 - Ordenação em memória principal/c/mergesort.h @@ -0,0 +1,6 @@ +#ifndef MERGESORT_H +#define MERGESORT_H +//============================================================================= +#include "geracao.h" +//============================================================================= +#endif \ No newline at end of file diff --git a/fonte/U4 - Ordenação em memória principal/c/quicksort.h b/fonte/U4 - Ordenação em memória principal/c/quicksort.h index e69de29..0aba351 100644 --- a/fonte/U4 - Ordenação em memória principal/c/quicksort.h +++ b/fonte/U4 - Ordenação em memória principal/c/quicksort.h @@ -0,0 +1,26 @@ +#ifndef QUICKSORT_H +#define QUICKSORT_H +//============================================================================= +#include "geracao.h" +//============================================================================= +void quicksortRec(int *array, int esq, int dir) { + int i = esq, j = dir; + int pivo = array[(dir+esq)/2]; + while (i <= j) { + while (array[i] < pivo) i++; + while (array[j] > pivo) j--; + if (i <= j) { + swap(array + i, array + j); + i++; + j--; + } + } + if (esq < j) quicksortRec(array, esq, j); + if (i < dir) quicksortRec(array, i, dir); +} +//============================================================================= +void quicksort(int *array, int n) { + quicksortRec(array, 0, n-1); +} +//============================================================================= +#endif \ No newline at end of file diff --git a/fonte/U4 - Ordenação em memória principal/c/selecao.h b/fonte/U4 - Ordenação em memória principal/c/selecao.h index 10a159d..7fa7d68 100644 --- a/fonte/U4 - Ordenação em memória principal/c/selecao.h +++ b/fonte/U4 - Ordenação em memória principal/c/selecao.h @@ -1,6 +1,6 @@ - #ifndef SELECAO_H - #define SELECAO_H - //============================================================================= +#ifndef SELECAO_H +#define SELECAO_H +//============================================================================= #include "geracao.h" //============================================================================= void selecao(int *array, int n){ diff --git a/fonte/U4 - Ordenação em memória principal/c/shellsort.h b/fonte/U4 - Ordenação em memória principal/c/shellsort.h index e69de29..e9c2dea 100644 --- a/fonte/U4 - Ordenação em memória principal/c/shellsort.h +++ b/fonte/U4 - Ordenação em memória principal/c/shellsort.h @@ -0,0 +1,31 @@ +#ifndef SHELLSORT_H +#define SHELLSORT_H +//============================================================================= +#include "geracao.h" +//============================================================================= +void insercaoPorCor(int *array, int n, int cor, int h){ + for (int i = (h + cor); i < n; i+=h) { + int tmp = array[i]; + int j = i - h; + while ((j >= 0) && (array[j] > tmp)) { + array[j + h] = array[j]; + j-=h; + } + array[j + h] = tmp; + } +} +//============================================================================= +void shellsort(int *array, int n) { + int h = 1; + + do { h = (h * 3) + 1; } while (h < n); + + do { + h /= 3; + for(int cor = 0; cor < h; cor++){ + insercaoPorCor(array, n, cor, h); + } + } while (h != 1); +} +//============================================================================= +#endif \ No newline at end of file From b937e76b2f62ad2a72a0b66967414e150849b880 Mon Sep 17 00:00:00 2001 From: axell-brendow Date: Tue, 18 Aug 2020 14:20:24 -0300 Subject: [PATCH 2/2] Remove um comentario --- fonte/U4 - Ordenação em memória principal/c/heapsort.h | 1 - 1 file changed, 1 deletion(-) diff --git a/fonte/U4 - Ordenação em memória principal/c/heapsort.h b/fonte/U4 - Ordenação em memória principal/c/heapsort.h index 398e354..52a9126 100644 --- a/fonte/U4 - Ordenação em memória principal/c/heapsort.h +++ b/fonte/U4 - Ordenação em memória principal/c/heapsort.h @@ -38,7 +38,6 @@ void heapsort(int *array, int n) { for(int i = 0; i < n; i++){ arrayTmp[i+1] = array[i]; } - // array = tmp; //Contrucao do heap for(int tamHeap = 2; tamHeap <= n; tamHeap++){