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 Ordenacao Rapida. Complexidade: em media O(n log n) |
005 | // Exemplo de metodo no paradgma "DIVISAO e CONQUISTA" |
006 | // Invocar: #include "ordena_insercao.h" |
007 | // ... |
008 | // XbibliotecaLOBx__ordenaRapido(int V[], int esq, int dir) |
009 | |
010 | // Programa recursivo para ordenar uma lista de inteiros usando a ideia separar menores e maiores que x |
011 | // depois ordenar cada trecho (se cada trecho for proximo de metade, resulta O(n log n)). |
012 | |
013 | // Ordena Rapido (Quick Sort) |
014 | void XbibliotecaLOBx__ordenaRapido (int V[], int esq, int dir) { |
015 | int i,j,x,w; |
016 | |
017 | // Particiona: separa menores que x para esquerda e maiores para direita |
018 | i = esq; |
019 | j = dir; |
020 | x = V[esq]; // x <- qualquer valor entre V[esq] e V[dir] |
021 | do { // Invariante: max{V[esq],...,V[i-1] } <= x <= min{V[j+1],...,V[dir] } |
022 | while ( V[i] < x ) i++; |
023 | while ( x < V[j] ) j--; |
024 | if (i<=j) { |
025 | if (i<j) { |
026 | w = V[i]; |
027 | V[i] = V[j]; |
028 | V[j] = w; |
029 | } |
030 | i++; |
031 | j--; |
032 | } |
033 | } while (i<j); // max{V[esq],...,V[j] } <= x <= min{V[i],...,V[dir] } |
034 | |
035 | if (esq<j) |
036 | XbibliotecaLOBx__ordenaRapido(V, esq, j); // ordena parte esquerda |
037 | if (i<dir) |
038 | XbibliotecaLOBx__ordenaRapido(V, i, dir); // ordena parte direita |
039 | } |