public class InsertionSortDate {
      

  public static void main(String[] args) {    
        
    if (args.length != 1) {
      System.out.println("Uso: java InsertionSortDate #elementi");
      System.exit(1);
    }  
      
    int len = Integer.parseInt(args[0]);
    
    if (len < 0) {
      System.out.println("Il numero di elementi deve essere positivo");
      System.exit(1);
    }  
    
    // costruttore di un vettore di date
    Date[] dates = new Date[len];

    for (int i = 0; i < dates.length; i++) {
      // costruttore di una data 
      dates[i] = new Date(Random.random(1, 30),
                          Random.random(1, 12),
                          Random.random(1972, 2010));
    }

    insertionSort(dates);

    for (int i = 0; i < dates.length; i++) {
      System.out.println(dates[i].day + "/" + dates[i].month + "/" + dates[i].year);
    }
  } 
 

  /** ordina cronologicamente (dalla più antica alla più recente) un vettore di date */  
  public static void insertionSort(Date[] a) {
  
    int i, j;
    Date key;
    
    for (j = 1; j < a.length; j++) {
      key = a[j];
      i = j-1;
      while (i >= 0 && lessThan(key, a[i])) {
        a[i+1] = a[i];
        i--;
      }
	    a[i+1] = key;
    }      
  }
  
  /* determina se la prima data segue la seconda in ordine cronologico */
  public static boolean lessThan(Date x, Date y) {
  
    return ((x.year < y.year) || 
           ((x.year == y.year) && (x.month < y.month)) ||
           ((x.year == y.year) && (x.month == y.month) && (x.day < y.day)));
  
  }
  
}


class Random {

  /** Restituisce un intero pseudo-casuale tra a e b (con b >= a >= 0)  */
  public static int random(int a, int b) {
    
    return a + (int) (Math.random() * (b - a + 1));
  }

  /** Restituisce un vettore di k interi pseudo-causali tra a e b */
  public static int[] randomArray(int a, int b, int k) {
    
    int[] v = new int[k];
    for (int i = 0; i < k; i++) {
      v[i] = random(a, b);
    }
    return v;
  }
  
}

class Date {

  // day, month, e year sono attributi d'istanza
  public int day;
  public int month;
  public int year;

  // metodo costruttore; deve avere il nome della classe; 
  // vengono omessi il tipo restituito e il modificatore;
  // si noti la notazione degli identificatori dei parametri (_attributo)
  public Date (int _day, int _month, int _year) {
  
    day = _day;
    month = _month;
    year = _year;
  }
}













