Linha | Codigo |
001 | // Prof. Leo^nidas - http://www.matematica.br http://line.ime.usp.br |
002 | // MAC0122 - 2017/08/23 |
003 | |
004 | // Biblioteca para: ordenar vetor de inteiros via metodo da Fusao. Complexidade: O(n log n) |
005 | // Exemplo de metodo no paradgma "DIVISAO e CONQUISTA" |
006 | // Invocar: #include "ordena_fusao.h" |
007 | // ... |
008 | // XbibliotecaLOBx__ordenaMetadesFusao(int V[], int esq, int dir) |
009 | |
010 | // Ordena por Fusao (Merge Sort) |
011 | // Programa recursivo para ordenar uma lista de inteiros usando a ideia ordenar 2 metades e depois fundi-las. |
012 | |
013 | #define MAX 25000 // maximo de elementos (TAMINI + NTESTES * PASSO) - veja em 'ordena_compara_metodos.c' |
014 | |
015 | // Se V[esq]<=V[esq+1]<=...<=V[med] e V[med+1]<=V[med+2]<=...<=V[dir] |
016 | // Entao funde em ordem unica V[esq] <= V[esq+1] <= ... <= V[dir-1] <= V[dir] |
017 | void XbibliotecaLOBx__Fusao (int V[], int esq, int med, int dir) { |
018 | int Aux[MAX], i, j, k, e1, d1, e2, d2; // dir=e2 |
019 | e1 = esq; d1 = med; |
020 | e2 = med+1; d2 = dir; |
021 | k = i = e1; |
022 | j = e2; |
023 | while (i<=d1 && j<=d2) { // compara os "topos", retire o menor dos dois colocando em nova pilha |
024 | if (V[i]<V[j]) // "topo" da pilha 1 e' o menor |
025 | Aux[k++] = V[i++]; |
026 | else |
027 | if (V[i]>V[j]) // "topo" da pilha 2 e' o menor |
028 | Aux[k++] = V[j++]; |
029 | else { // havendo empate pegue os dois "topos" |
030 | Aux[k++] = V[i++]; |
031 | Aux[k++] = V[j++]; |
032 | } |
033 | } |
034 | while (i<=d1) // copia restante de V[e1..d1] |
035 | Aux[k++] = V[i++]; |
036 | while (j<=d2) // copia restante de V[e2..d2] |
037 | Aux[k++] = V[j++]; |
038 | for (i=e1; i<=d2; i++) // reconstroi V[e1..d2] ordenado |
039 | V[i]=Aux[i]; |
040 | } |
041 | |
042 | // Ordena V[esq .. dir] usando tecnica de DIVISAO E CONQUISTA, divida em 2 metades |
043 | // ordene cada uma e depois funda para obter ordem das 2 partes |
044 | void XbibliotecaLOBx__ordenaMetadesFusao (int V[], int esq, int dir) { |
045 | int med; |
046 | med = (esq+dir)/2; |
047 | if (esq<med) |
048 | XbibliotecaLOBx__ordenaMetadesFusao(V, esq, med); // ordena V[esq .. m] |
049 | if (med<dir) |
050 | XbibliotecaLOBx__ordenaMetadesFusao(V, med+1, dir); // ordena V[m+1 .. dir] |
051 | XbibliotecaLOBx__Fusao(V, esq, med, dir); // funde em ordem unica V[esq .. m] com V[m+1 .. dir] |
052 | } |