主要内容:
分解:把序列按一定长度(1、2、4、8……)划分成若干部分
合并:将划分后的序列两两合并
(来源:http://www.cnblogs.com/jingmoxukong/p/4308823.html )
java代码:
public class MergeSort {
public static void main(String[] args) {
int[] array = { 2, 3, 5, 1, 4, 6, 8, 7 };
mergeSort(array, 1);
printArray(array);
}
// 每个分组有d个元素
public static void mergeSort(int[] array, int d) {
if (d == array.length)
return;
// 当数组长度不是2的整数次方时会导致无法完美分割,最后会有一个长序列和一个短序列,此时需要额外进行一次合并
if (d > array.length) {
System.out.print("d=" + d + "/2=" + d / 2 + ": ");
merge(array, 0, d / 2 - 1, array.length - 1);
return;
}
for (int i = 0; i + 2 * d - 1 < array.length; i = i + 2 * d) {
merge(array, i, i + d - 1, i + 2 * d - 1);
}
System.out.print("d=" + d + ": ");
printArray(array);
mergeSort(array, d * 2);
}
// 合并array[left,mid] 和 array[mid+1,right]两个区间,这两个区间已经是有序的了
private static void merge(int[] array, int left, int mid, int right) {
int[] temp = new int[right - left + 1];
int l = left, r = mid + 1, t = 0;
while (l <= mid && r <= right) {
if (array[l] < array[r])
temp[t++] = array[l++];
else
temp[t++] = array[r++];
}
while (l <= mid) {
temp[t++] = array[l++];
}
while (r <= right) {
temp[t++] = array[r++];
}
for (int i = left, j = 0; i <= right; i++, j++) {
array[i] = temp[j];
}
}
private static void printArray(int[] array) {
for (int i = 0; i < array.length - 1; i++)
System.out.print(array[i] + ",");
System.out.println(array[array.length - 1]);
}
}
测试:
int[] array = { 2, 3, 5, 1, 4, 6, 8, 7 };
输出:
d=1: 2,3,1,5,4,6,7,8
d=2: 1,2,3,5,4,6,7,8
d=4: 1,2,3,4,5,6,7,8
1,2,3,4,5,6,7,8
//
int[] array = { 2, 3, 5, 1, 4 };
输出:
d=1: 2,3,1,5,4
d=2: 1,2,3,5,4
d=4: 1,2,3,5,4
d=8/2=4: 1,2,3,4,5