此博客代码一些错误的地方已改正
1.简介
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法
(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
2.实现思路
-
将数组分解直到分解的数组长度小于2
-
申请一个新数组,新数组长度为当前分解出来的数组长度之和
-
再将分解的数组中的元素进行对比(左右数组对比)
-
将符合条件的元素放入新数组并返回新数组
-
新数组再和分解出来的数组进行对比
-
重复2-5
3.实现代码
public static int[] sort(int[] sourceArray) {
if (sourceArray.length < 2) {
return sourceArray;
}
// 切分数组
int middle = (int) Math.floor(sourceArray.length / 2);
int[] left = Arrays.copyOfRange(sourceArray, 0, middle);
int[] right = Arrays.copyOfRange(sourceArray, middle, sourceArray.length);
// 对切分的数组进行排序
return merge(sort(left), sort(right));
}
protected static int[] merge(int[] left, int[] right) {
// 申请新数组
int[] result = new int[left.length + right.length];
// 定义索引
int index = 0;
// 对当前数组进行排序
while (left.length > 0 && right.length > 0) {
if (left[0] <= right[0]) {
result[index++] = left[0];
left = Arrays.copyOfRange(left, 1, left.length);
} else {
result[index++] = right[0];
right = Arrays.copyOfRange(right, 1, right.length);
}
}
// 将已经排好序的数组放入当前数组 进行合并
while (left.length > 0) {
result[index++] = left[0];
left = Arrays.copyOfRange(left, 1, left.length);
}
while (right.length > 0) {
result[index++] = right[0];
right = Arrays.copyOfRange(right, 1, right.length);
}
// 返回合并后的数组
return result;
}
{\__/} {\__/}
( ·-·) (·-· )
/ >------------------------------------------------< \
| ☆ |
| ☆ |
| ★ |
| ☆ |
| ☆ |
| |
-------------------------------------