/*
 * arquivo: ordena_1.c
 * -------------------
 * Este programa ordena crescentemente um vetor real com n elementos
 * (n < 100).
 *
 * Ordem dos dados: n (inteiro), vetor real x com n elementos.
 */
#include <stdio.h>

#define NMAX 100

void leia_vetor(double v[], int n);
void imprima_vetor(double v[], int n);
int procura_index(double v[], int i, int n);
void troque(double v[], int index_min, int i);
void ordene_vetor(double v[], int n);

/************************************************************/

int main()
{
    double x[NMAX];
    int n;

    printf("Forneca o valor de n: ");
    scanf("%d", &n);

    leia_vetor(x, n);
    imprima_vetor(x, n);
    ordene_vetor(x, n);
    printf("O vetor foi ordenado.");
    imprima_vetor(x, n);

    return 0;
}

/*----------------------------------------------------------*/
/*
 * leia_vetor():
 * =============
 * Recebe um vetor de double v[] e um inteiro n.
 * Le n reais e os coloca em em v[], isto e', em
 * v[0],...,v[n-1].
 */
void leia_vetor(double v[], int n)
{
    int i;

    printf("Forneca os %d doubles: ", n);
    for (i = 0; i < n; i++)
	scanf("%lf", &v[i]);
}

/*-----------------------------------------------------------*/
/*
 * imprima_vetor():
 * ================
 * Recebe um vetor de n doubles v[] e o inteiro n
 * e imprime v[], isto e', imprime v[0],...,v[n-1].
 */
void imprima_vetor(double v[], int n)
{
    int i;

    printf("Os elementos do vetor sao ");
    for (i = 0; i < n; i++)
	printf("%g ", v[i]);
    printf("\n");
}

/*-----------------------------------------------------------*/
/*
 * ordene_vetor():
 * ==============
 * Recebe um vetor de n doubles v[0..n-1], um inteiro n,
 * e ordena esse vetor em ordem crescente.
 */

void ordene_vetor(double v[], int n)
{
    int i, index_min;
    for (i = 0; i < n - 1; i++) {
	index_min = procura_index(v, i, n);
	troque(v, index_min, i);
    }

}

/*-----------------------------------------------------------*/
/*
 * procura_index():
 * ===========
 * Recebe um vetor de n doubles v[0..n-1], um inteiro i e um inteiro n,
 * e determina a posicao entre i e n-1 onde se encontra um menor 
 * elemento desse vetor
 */

int procura_index(double v[], int i, int n)
{
    int j, index;
    double min;

    min = v[i];
    index = i;

    for (j = i + 1; j < n; j++)
	if (v[j] < min) {
	    min = v[j];
	    index = j;
	}
    return index;
}

/*-----------------------------------------------------------*/
/*
 * troque():
 * ======
 * Recebe um vetor de n doubles v[0..n-1], um inteiro index_min e
 * e um inteiro i, e troca entre si o conteudo das posicoes index_min e i.
 */

void troque(double v[], int index_min, int i)
{
    double temp;
    temp = v[index_min];
    v[index_min] = v[i];
    v[i] = temp;
}
