归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个指针,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
算法实现如下:
import java.util.Arrays;
public class MergeSort {
public static void mergeSort(double[] array) {
int length = array.length;
if (length > 1) {
int middle = length / 2;
double partitionA[] = Arrays.copyOfRange(array, 0, middle);
double partitionB[] = Arrays.copyOfRange(array, middle, length);
mergeSort(partitionA);
mergeSort(partitionB);
sort(partitionA, partitionB, array);
}
}
private static void sort(double[] partitionA, double[] partitionB, double[] array) {
int i = 0;
int j = 0;
int k = 0;
while (i < partitionA.length && j < partitionB.length) {
if (partitionA[i] <= partitionB[j]) {
array[k] = partitionA[i];
i++;
} else {
array[k] = partitionB[j];
j++;
}
k++;
}
if (i == partitionA.length) {
while (k < array.length) {
array[k] = partitionB[j];
k++;
j++;
}
} else if (j == partitionB.length) {
while (k < array.length) {
array[k] = partitionA[i];
k++;
i++;
}
}
}
}