public class MergeSort {
	public static void main(String[] args) {
		MergeSort ms = new MergeSort();
		// int[] a = ms.merge(3, 2);
		// a = ms.merge(2, 3);
		int[] b = { 1, 2, 3, 4, 5, 6 };
		int[] c = { 4, 5, 6, 7, 6, 354, 7542, 61, 34, 67, 8, 3, 4, 8, 1, 4, 6,
				89, 2, 3, 4, 7, 234, 545, 2, 34, 8 };
		long start = System.currentTimeMillis();
		c = ms.sort(c);
		long end = System.currentTimeMillis();
		System.out.println("MergeSort a array with lenght of " + c.length
				+ " in " + (end - start) + " second");
		for (int i = 0; i < c.length; i++) {
			System.out.println(c[i]);
		}
	}
	private int[] sort(int[] number) {
		int dividPoint = number.length / 2;// 4-2 5-2;
		// int secondPart = firstPart+1;
		int[] sortedArray = null;
		int[] firstArray = getArray(number, 0, dividPoint);
		int[] secondArray = getArray(number, dividPoint, number.length);
		// secondArray = divid(secondArray);
		if (firstArray.length > 2) {
			firstArray = sort(firstArray);
		} else if (firstArray.length <= 2) {
			firstArray = merge(firstArray);
		}
		if (secondArray.length > 2) {
			secondArray = sort(secondArray);
		} else if (secondArray.length <= 2) {
			secondArray = merge(secondArray);
		}
		sortedArray = merge(firstArray, secondArray);
		return sortedArray;
	}
	private int[] getArray(int[] arr, int start, int end) {
		int[] subArray = new int[end - start];
		int subindex = 0;
		for (int index = start; index < end; index++) {
			subArray[subindex] = arr[index];
			subindex++;
		}
		return subArray;
	}
	private int[] merge(int i, int j) {
		int[] array = new int[2];
		if (i > j) {
			array[0] = j;
			array[1] = i;
		} else {
			array[0] = i;
			array[1] = j;
		}
		return array;
	}
	private int[] merge(int[] i) {
		int[] returnArr = null;
		if (i.length == 1) {
			returnArr = merge(i[0]);
		}
		if (i.length == 2) {
			returnArr = merge(i[0], i[1]);
		}
		return returnArr;
	}
	private int[] merge(int i) {
		int[] array = new int[1];
		array[0] = i;
		return array;
	}
	private int[] merge(int[] i, int[] j) {
		int[] array = new int[i.length + j.length];
		int pointi = 0;
		int pointj = 0;
		for (int index = 0; index < array.length; index++) {
			if (pointi < i.length && pointj < j.length) {
				if (i[pointi] <= j[pointj]) {
					array[index] = i[pointi];
					pointi++;
				} else {
					array[index] = j[pointj];
					pointj++;
				}
			} else {
				if (pointi == i.length && pointj < j.length) {
					int addedIndex = i.length + pointj - 1;
					for (int newIndex = addedIndex + 1; newIndex < array.length; newIndex++) {
						array[newIndex] = j[pointj];
						pointj++;
					}
					break;
				}
				if (pointi < i.length && pointj == j.length) {
					int addedIndex = j.length + pointi - 1;
					for (int newIndex = addedIndex + 1; newIndex < array.length; newIndex++) {
						array[newIndex] = i[pointi];
						pointi++;
					}
					break;
				}
			}
		}
		return array;
	}
}