/**
 * 
 * @author Ognjen Savkovic (ognjen.savkovic@unibz.it)
 * 
 * This class tests run times two methods: MaxSortShiftRight and MaxSortSwap
 * defined in class ArrayUtility
 */
public class runTimeTestMaxSort {
	

	public static void main(String[] args) {
										// prints running times for MaxSortShiftRight and MaxSortSwap 
		compareMaxSortAlgs();			// for random arrays of sizes specified in RANDOM_ARRAY_SIZES
	}
	
	
	// sizes of random arrays that the class generate for testing
	public static int [] RANDOM_ARRAY_SIZES = {10,10,100,100,1000,1000,10000,10000,100000,100000};
		
	
	public static int[][] generateRandomArrays(){
		int [][] randomArrays; 	// random arrays of size 10, 100, 100, ...
		
		randomArrays = new int [RANDOM_ARRAY_SIZES.length][];
	
		for(int i=0; i<RANDOM_ARRAY_SIZES.length; i++)
			randomArrays[i] =  ArrayUtility.createRandomArray(RANDOM_ARRAY_SIZES[i],1,RANDOM_ARRAY_SIZES[i]); 
			
		return randomArrays;
	}
	
	/**
	 * @param randomArrays random arrays of sizes in RANDOM_ARRAY_SIZES
	 * @return running times for maxSortShiftRight for arrays in randomArrays
	 */
	public static long [] runningTimeMaxSortShiftRight(int [][] randomArrays){
		long [] runningTime;	// sorting times for each size 10, 100, ...
		long startTime;			// start time
		long estimatedTime;		// current time - start times
		
		runningTime = new long[RANDOM_ARRAY_SIZES.length];
		
		for(int i=0; i<RANDOM_ARRAY_SIZES.length; i++){ 
			
			startTime = System.nanoTime();
			ArrayUtility.maxSortShiftRight(randomArrays[i]);
			estimatedTime = System.nanoTime() - startTime;
	
			runningTime[i] = estimatedTime;
		} 
		
		return runningTime;
		
	}
	
	
	/**
	 * @param randomArrays random arrays of sizes in RANDOM_ARRAY_SIZES
	 * @return running times for maxSortSwap for arrays in randomArrays
	 */
	public static long [] runningTimeMaxSortSwap(int [][] randomArrays){
		long [] runningTime;	// sorting times for each size 10, 100, ...
		long startTime;			// start time
		long estimatedTime;		// current time - start times
		
		runningTime = new long[RANDOM_ARRAY_SIZES.length];
		
		for(int i=0; i<RANDOM_ARRAY_SIZES.length; i++){ 
			
			startTime = System.nanoTime();
			ArrayUtility.maxSortSwap(randomArrays[i]);
			estimatedTime = System.nanoTime() - startTime;
	
			runningTime[i] = estimatedTime;
		} 
		
		return runningTime;
		
	}
	
	
	
	
	/**
	 * prints running times for MaxSortShiftRight and MaxSortSwap
	 */
	public static void compareMaxSortAlgs(){
		int [][] randomArrays; 									// random arrays of size 10, 100, 100, ...
		int [][] randomArraysCopy; 								// copy of randomArrays
		
		randomArrays = generateRandomArrays();
		randomArraysCopy = copyArrayOfArrays(randomArrays);		// we need copy because MaxSort changes/sorts arrays
			
		testArrayUtility.printLongArray("runningTimeMaxSortShiftRight()",runningTimeMaxSortShiftRight(randomArrays));
		testArrayUtility.printLongArray("runningTimeMaxSortSwap()",runningTimeMaxSortSwap(randomArraysCopy));
		
	}

	
	/**
	 * @param arrayOfArrays
	 * @return return a deep-copy of arrayOfArrays
	 */
	public static int [] [] copyArrayOfArrays(int [][] arrayOfArrays){
		int [] [] arrayOfArraysCopy;
		
		arrayOfArraysCopy = new int[arrayOfArrays.length][];		// allocate space for a number of new arrays
		
		for(int i=0; i < arrayOfArrays.length; i++)
			arrayOfArraysCopy[i] = ArrayUtility.copyArray(arrayOfArrays[i]);
		
		return arrayOfArraysCopy;		
	}
	
	

	
	
	
	
}