Linha | Codigo |
001 | // Prof. Leo^nidas - http://www.matematica.br http://line.ime.usp.br |
002 | // MAC0122 - 2017/08/21 |
003 | |
004 | // Ordena vetor de inteiros via metodo Selecao Direta. Complexidade: O(n^2) |
005 | |
006 | #include <stdio.h> |
007 | |
008 | #define MAX 60 |
009 | #define INTERVALO 100 // para gerar valores pseudo-aleatorios (modulo 100 => numeros entre 0 e 99) |
010 | |
011 | int determineIndiceDoMenor (int vet[], int ini, int n) { |
012 | int indice, menor, i; |
013 | indice = ini; |
014 | menor = vet[ini]; |
015 | for (i=ini+1; i<n; i++) { // invariante: vet[indice] <= vet[j], j em { ini, ini+1, ini+2, ... i-2, i-1 } |
016 | if (menor>vet[i]) { // novo menor |
017 | menor = vet[i]; |
018 | indice = i; |
019 | } |
020 | } // complexidade: O(n) |
021 | return indice; // indice do menor entre vet[ini .. n-1] |
022 | } |
023 | |
024 | // Ordena via Selecao Direta |
025 | void ordenaViaSelecaoDireta (int vet[], int n) { |
026 | int ii, imin, aux; |
027 | for (ii = 0; ii < n-1; ii++) { // invariante: vet[0]<=vet[1]<=...<=vet[ii-1] <= vet[j], j em { ii, ii+1, ..., n-1 } |
028 | imin = determineIndiceDoMenor(vet, ii, n); |
029 | aux = vet[ii]; |
030 | vet[ii] = vet[imin]; |
031 | vet[imin] = aux; |
032 | } |
033 | } // complexidade: O(n^2) |
034 | |
035 | int main () { |
036 | int dados[MAX]; |
037 | int n, ii, ordem; |
038 | printf("\n\n\nDados iniciais:\n"); |
039 | // scanf ("%d", &n); for (ii = 0; ii < n; ii++) scanf("%d", &dados[ii]); |
040 | n = 10; |
041 | for (ii=0; ii<n; ii++) { |
042 | dados[ii] = rand() % INTERVALO; |
043 | printf("%3d", dados[ii]); |
044 | } |
045 | |
046 | ordenaViaSelecaoDireta(dados, n); |
047 | |
048 | printf("\nVetor ordenado:\n"); |
049 | for (ii = 0; ii < n; ii++) |
050 | printf("%3d", dados[ii]); |
051 | |
052 | printf("\n"); |
053 | return 0; |
054 | } |