1,思想:采用先化整为零,然后合零为整的思想。即先把序列一分为二,再把子序列一分为二,依次下去直到不能再分割即到子序列只有一个元素。最后将分割的子序列使用合并排序。
2,效率:空间复杂度加倍;时间复杂度为N*logN,与快速排序,基数排序相同。
3,Java代码的递归实现:
public class MergeSorter {
public static void mergeSort(int[] array) {
int[] workArray = new int[array.length];
recMergeImpl(workArray, array, 0, array.length - 1);
}
private static void recMergeImpl(int[] workArray, int[] array, int left,
int right) {
if (left == right) {
return;// just have one element,return from recusive.
}
int mid = (left + right) / 2;
recMergeImpl(workArray, array, left, mid);
recMergeImpl(workArray, array, mid + 1, right);
merge(workArray, array, left, mid, right);
}
/**
* merge two child seq.
*
* @param workArray
* @param array
* @param leftPtr
* @param rightPtr
* @param rightBound
*/
private static void merge(int[] workArray, int[] array, int left, int mid,
int right) {
int j = 0;
int leftPtr = left;
int rightPtr = mid + 1;
while (leftPtr <= mid && rightPtr <= right) {
if (array[leftPtr] < array[rightPtr])
workArray[j++] = array[leftPtr++];// copy element to work array.
else
workArray[j++] = array[rightPtr++];// copy element to work
// array.
}
while (leftPtr <= mid) {// right finish,but left still left element.
workArray[j++] = array[leftPtr++];
}
while (rightPtr <= right) {// left finish,but right still left element.
workArray[j++] = array[rightPtr++];
}
int workElementsLen = right - left + 1;
for (j = 0; j < workElementsLen; j++) {// copy workArray sorted element
// to source array.
array[left + j] = workArray[j];
}
}
}