归并排序
前两天写了4个排序 今天弄明白了一个稍微复杂点的排序算法、
归并排序
归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。
简单理解
归并排序就是把一个数组通过递归的方式 不断的从中间拆分,直到不可再分为止(分);
然后开始合并 边合并边排序 返回合并后的子数组 直到数组排序完成(治)。
演示图片 (菜鸟)
代码如下
//归并排序
public int[] mergesort(int[] sourceArray) {
// 对 arr 进行拷贝,不改变参数内容
int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
//当数组长度不可再分 结束
if (arr.length < 2) {
return arr;
}
//将数组拆分成两份 一个left 一个right
int middle = (int) Math.floor(arr.length / 2);
int[] left = Arrays.copyOfRange(arr, 0, middle);
int[] right = Arrays.copyOfRange(arr, middle, arr.length);
//递归拆分数组 直到不可再分
return merge(mergesort(left), mergesort(right));
}
//归并方法
int[] merge(int[] left, int[] right) {
//新建一个空间 用于保存两个数组
int[] result = new int[left.length + right.length];
int i = 0;
while (left.length > 0 && right.length > 0) {
if (left[0] <= right[0]) {
result[i++] = left[0];
left = Arrays.copyOfRange(left, 1, left.length);
} else {
result[i++] = right[0];
right = Arrays.copyOfRange(right, 1, right.length);
}
}
while (left.length > 0) {
result[i++] = left[0];
left = Arrays.copyOfRange(left, 1, left.length);
}
while (right.length > 0) {
result[i++] = right[0];
right = Arrays.copyOfRange(right, 1, right.length);
}
return result;
}