package mergeSort;
import java.util.Arrays;
public class MergeSort {
/**
* 合并两段有序数组
*
* @param arr
* 原数组
* @param start
* 第一段有序数组的起始下标
* @param mid
* 第一段有序数组的结束下标
* @param end
* 第二段有序数组的结束下标
*/
private static void mergeArray(int[] arr, int start, int mid, int end) {
int i = start, j = mid + 1, k = 0;
int[] arr2 = new int[end - start + 1];
while (i <= mid && j <= end) {
if (arr[i] <= arr[j]) {
arr2[k++] = arr[i];
i++;
} else {
arr2[k++] = arr[j];
j++;
}
}
while (i <= mid) {
arr2[k++] = arr[i++];
}
while (j <= end) {
arr2[k++] = arr[j++];
}
for (i = start, k = 0; i <= end; i++, k++) {
arr[i] = arr2[k];
}
}
/**
* 全部合并
*
* @param arr
* 原数组
* @param gap
* 每次合并的长度
* @param length
* 数组长度
*/
private static void merge(int[] arr, int gap, int length) {
int i = 0;
for (i = 0; i + 2 * gap - 1 < length; i = i + 2 * gap) {
mergeArray(arr, i, i + gap - 1, i + 2 * gap - 1);
}
if (i + gap - 1 < length) {
mergeArray(arr, i, i + gap - 1, length - 1);
}
}
/**
* 排序
*
* @param arr
* 原数组
*/
public static void mergeSort(int[] arr) {
for (int gap = 1; gap < arr.length; gap = gap * 2) {
merge(arr, gap, arr.length);
}
}
}