Sorts


public class Sorts{
	public static void main(String[] args){
		int[] arr = {11, 7, 12, 14, 19, 1, 6, 18, 8, 20 };
		int[] arr2 = {25, 44, 16, 62, 76, 19, 12, 5, 25, 9};
		int[] arr3 = {12, 14, 3, 8, 20, 9, 26};
		int[] arr4 = {12, 4, 2, 8, 5};
		int[] arr5 = {3, 17, 18, 1,24, 2, 19};
		//printArray(arr);
		//selection(arr);
		//insertion2(arr2);
		printArray(arr2);//change for different array
		mergeSort(arr2, 0, arr2.length-1);//change for different array
		System.out.println("done");
		printArray(arr2);


	}
	public static void selection(int[] a){
		int n = a.length;
		for (int i= 0; i < n; i++){
			int minPos = i;
			for (int j = i+1; j < n; j++){
				if (a[j] < a[minPos]){
					minPos = j;
				}
			}
			int temp = a[i];
			a[i] = a[minPos];
			a[minPos] = temp;
			printArray(a);
		}

	}

	public static void insertionSort(int[] A){
		int itemsSorted;
		for (itemsSorted = 1; itemsSorted < A.length; itemsSorted++){
			int temp = A[itemsSorted];
			int loc = itemsSorted - 1;
			while (loc >= 0 && A[loc] > temp){
				A[loc + 1] = A[loc];
				loc = loc - 1;
			}
			A[loc + 1] = temp;
			//printArray(A);
		}
	}
	public static void insertion2(int[] a){
		int n = a.length;
		for (int i = 1; i < n; i++){
			for ( int j = i; j > 0; j--){
				if(a[j-1] > a[j]){
					int temp = a[j-1];
					a[j-1] = a[j];
					a[j] = temp;
				}
				else{
					break;
				}
			}
			printArray(a);
		}
	}



	public static void printArray(int[] a){
		for(int elt: a){
			System.out.print(elt + "  ");
		}
		System.out.println();
	}


	/* Pre: recieves an array of ints
	 * Post: array is sorted in ascending order
	 */

	public static void mergeSort (int[] a, int l, int r){
		if (l >= r) return;

		int middle = (l + r)/ 2;

	    mergeSort(a, l, middle);
		mergeSort(a, middle + 1, r);
		merge2(a, l, r);
		//merge(a, l, middle, r);
		printArray(a);
	
    }


public static void merge (int[] a, int left, int mid, int right){

	int[] b = new int[mid - left + 1];

	for (int i = 0; i <= mid - left; i++){
		b[i] = a[left + i];
	}

	int i = 0;
	int j = mid + 1;
	int k = left;
	while (i <= mid - left && j <= right){
	  if (a[j] < b[i]){
  		a[k]= a[j];
		k++;
		j++;
 		} else{
	 		a[k]= b[i];
	 		k++;
	 		i++;
 		}
	}

	while (i <= mid - left){
		a[k] = b[i];
		k++;
		i++;
		}
	while (j <= right){
		a[k] = a[j];
		k++;
		j++;
	}

 
}

public static void merge2 (int[] a, int left, int right){
	
	int[] temp = new int[right - left + 1];
	if (left >= right ) return;

	int mid = (left + right)/2; 
	int i = 0;//fills temp array
	int leftIndex = left;
	int rightIndex = mid + 1; 

	while ((leftIndex <= mid) && (rightIndex <= right)){
	  if (a[leftIndex] <= a[rightIndex]){
  		temp[i]= a[leftIndex];
		leftIndex++;
 		} else{
	 		temp[i]= a[rightIndex];
	 		rightIndex++;
		 }
		 i++;
	}

	while (leftIndex <= mid){
		temp[i] = a[leftIndex];
		leftIndex++;
		i++;
		}
	while (rightIndex <= right){
		temp[i] = a[rightIndex];
		rightIndex++;
		i++;
	}
	for (i  = left; i <= right; i++){
		a[i] = temp[i-left];
	}
	
}

/* Pre: recieves an array of ints and two indexes
	 * Post: the values in the two indexes are swaped
	 */
	public static void swap(int[] data, int spot1, int spot2)
	{
		int temp 	= data[spot1];
		data[spot1]	= data[spot2];
		data[spot2]	= temp;
	}
}