归并排序算法思路
- 如果数组长度为1,return
- 将数组对半分,对两部分分别进行归并排序
- 将上一步中归并排序后的数组合并起来
算法实现
java
public class MergeSort {
/* 归并排序算法,对输入的数组a进行排序
*/
public int[] MergeSort(int[] a) {
int size = a.length;
if (size <= 1) {
return a;
} else {
int halfSize = size / 2;
int[] x = new int[halfSize];
int[] y = new int[size - halfSize];
System.arraycopy(a, 0, x, 0, halfSize);
System.arraycopy(a, halfSize, y, 0, size-halfSize);
int[] xSorted = MergeSort(x);
int[] ySorted = MergeSort(y);
return merge(xSorted, ySorted);
}
}
/* 将两个有序数组合并为一个有序数组
*/
private int[] merge(int[] x, int[] y) {
if (x.length == 0) {
return y;
} else if (y.length == 0) {
return x;
} else {
if (mergeCompare(x, y)) {
return mergeHelper(x, y);
} else {
return mergeHelper(y, x);
}
}
}
/* 比较x和y的第一个元素a、b,如果a < b,返回true;否则返回false
*/
private boolean mergeCompare(int[] x, int[] y) {
return x[0] < y[0];
}
private int[] mergeHelper(int[] x, int[] y) {
int[] res = new int[x.length + y.length];
res[0] = x[0];
int[] xNew = new int[x.length - 1];
System.arraycopy(x, 1, xNew, 0, x.length - 1);
int[] nums = merge(xNew, y);
System.arraycopy(nums, 0, res, 1, x.length + y.length - 1);
return res;
}
/* 测试算法效果
*/
public static void main(String[] args) {
MergeSort test = new MergeSort();
int[] a = new int[]{1, -3, 6, 9, 22, -4, 3};
int[] b = test.MergeSort(a);
for (int i = 0; i < b.length; i++) {
System.out.println(b[i]);
}
}
}
时间复杂度
O(NlogN)