导航:
归并排序的思想就是通过合并两个小的序列使合并后的大的序列有序。讲详细一些就是,合并两个序列,因为这两个序列都是通过合并得到的,所以这两个序列内部都是有序的,那么就可以先比较两个序列的开头元素,谁小谁就先进入合并后的序列中,然后指针后移继续比较,如果有一个序列的元素已经全部进入了合并后的序列当中,那么就可以直接把另一个序列剩下元素直接追加到合并后的序列中了,最终将合并完全有序的一个序列。
代码实现:
public class MergeSort {
public static void main(String[] args) {
//定义数组
int[] arr = {99, 55, 2, 3, 9, 10, 22, 34, 67, 89, 69, 92};
//这里定义一个临时数组,方便复用
int[] current = new int[arr.length];
int left = 0;
int right = arr.length - 1;
sort(left, right, arr, current);
for (int i : arr) {
System.out.println(i);
}
}
public static void sort(int left, int right, int[] arr, int[] current) {
if (left < right) {
int mid = (left + right) / 2;
//划分子序列
sort(left, mid, arr, current);
sort(mid + 1, right, arr, current);
//合并
merge(left, right, mid, arr, current);
}
}
public static void merge(int left, int right, int mid, int[] arr, int[] current) {
int i = 0;
//左边序列和右边序列起始下标
int j = left;
int k = mid + 1;
//当有一个序列全部合并之后就结束
while (j <= mid && k <= right) {
if (arr[j] < arr[k]) {
current[i] = arr[j];
i++;
j++;
} else {
current[i] = arr[k];
i++;
k++;
}
}
//如果左边序列还有剩余就全部放进临时数组
while (j <= mid) {
current[i] = arr[j];
i++;
j++;
}
//如果有变序列还有剩余就全部放进临时数组
while (k <= right) {
current[i] = arr[k];
i++;
k++;
}
//将临时数组拷贝到原数组相应的位置
for (int t = 0; t < i; t++) {
arr[left + t] = current[t];
}
}
}
输出:
2
3
9
10
22
34
55
67
69
89
92
99
本文动图演示引自:https://www.cnblogs.com/onepixel/articles/7674659.html