归并排序
算法描述:
归并操作的过程如下:
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针达到序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
package com.maogh.sort;
/**
* merge sort
*
* @author Ivan Mao
*
*/
public class MergeSort implements Sort {
@Override
public float[] sort(float[] a) {
if (a.length < 2) {
return a;
}
int mid = a.length / 2;
float[] left = new float[mid];
float[] right = new float[a.length - mid];
System.arraycopy(a, 0, left, 0, mid);
System.arraycopy(a, mid, right, 0, a.length - mid);
return merge(sort(left), sort(right));
}
public float[] merge(float[] a, float[] b) {
int len = a.length + b.length;
float[] c = new float[len];
int i = 0, j = 0, k = 0;
while (i < a.length && j < b.length) {
if (a[i] < b[j]) {
c[k++] = a[i++];
} else if (a[i] >= b[j]) {
c[k++] = b[j++];
}
}
while (i < a.length) {
c[k++] = a[i++];
}
while (j < b.length) {
c[k++] = b[j++];
}
return c;
}
}