
/// prova a scrivere un programma C che ordina un vettore
/// riempito con numeri psudocasuali
/// Algoritmo: scambia i valori del vettore, partendo dal primo
/// e arrivando al penultimo, confrontando un elemento con il successivo.
/// se l'elemento e' maggiore del successivo, li scambio.
/// mi fermo quando, avendo passato tutto il vettore, non ho fatto
/// neanche uno scambio.

/// quali funzioni recupero ???
/// Random()
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>


#define MAX 500000
int v[MAX];


// Random(X) ritorna un numero fra 1 e X

int Random(int N)
{
    static int primavolta = 1; // BOOLEANO
    if (primavolta)
    {
        srand(time(NULL)); /* inizializzo il seme */
        primavolta = 0;
    }
    return (rand() % N) + 1;
}


void scambia(int v[], int px, int py)
{
    int dep=v[px];
    v[px] = v[py];
    v[py] = dep;
}


void visualizza(int v[], int nelem)
{
    int i;
    int c;
    for(i=0; i < nelem; i++)
    {
        printf("v[%d]=%d\n",i,v[i]);
        if (i%24==0 && i !=0)
        {
            printf("Ancora (S/N)-->");
            c = getchar(); /// pesco il carattere
            getchar(); /// pesco l'invio
            ///printf("c=[%c] - asci[%d]\n",c,c);
            if (c == 'N' || c == 'n')
                return; /// mi fermo
        }

    }
}

void bubblesort(int v[], int dim)
{
    int i;
    int scambio; /// booleano a falso
    do
    {
        scambio=0;/// falso
        for(i=0; i < dim-1; i++)
            if (v[i] > v[i+1])
            {
                scambia(v,i,i+1);
                scambio=1; /// vero
            }

    }
    while(scambio);     /// giro finche scambio e' vero, cioe' ho fatto almeno 1 scambio

}


int main()
{
    int i;
    int nelem; /// numeri elementi del vettore
    ///int v[]={1,4,-4,-2,0,1,7 };
    system("bubblesort.png"); /// visualizza l'immagine
    do
    {
        char invio; /// solo per invio pendente
        printf("Quanti elementi metto nel vettore ?(max %d) ->",MAX);
        scanf("%d%c",&nelem,&invio);
    }
    while(nelem < 2 || nelem > MAX);

    /*** chiedi all'utente quanti N elementi vuol mettere nel vettore ***/
    for(i=0; i <nelem; i++) /*** riempilo con N numeri pseudocasuali fra 1 e N ***/
        v[i]=Random(nelem);
    /*** ordina il vettore***/
    printf("Inizio Ordinamento con bubblesort...\n");
    bubblesort(v,nelem);
    printf("Fine Ordinamento con bubblesort...\n%c",7);
    /*** visualizza il vettore ordinato ***/
    visualizza(v,nelem);
    /*** visualizza il tempo di ordinamento per N elementi ***/

    return 0;
}


