| 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 | } |