赞
踩
归并排序是分治思想(divide-and-conquer)的经典运用。分治是先将现有问题分(divide)成一些小问题去递归求解,然后再将所有分的问题进行治理(conquer)合并得到最终结果。
下图来自参考文献1,该图就很清晰描述了归并排序的全过程。
public class MergeSort {
public static void merge(int[] arr, int left, int mid, int right, int [] tmp) {
int i = left;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= right) {
if (arr[i] < arr[j]) {
tmp[k++] = arr[i++];
} else {
tmp[k++] = arr[j++];
}
}
while (i <= mid) {
tmp[k++] = arr[i++];
}
while (j <= right) {
tmp[k++] = arr[j++];
}
// 注意原始数组下标是从left开始,临时数组下标从0开始
k = 0;
while (left <= right) {
arr[left++] = tmp[k++];
}
}
public static void mergeSort(int[] arr, int left, int right, int[] tmp) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid, tmp);
mergeSort(arr, mid + 1, right, tmp);
merge(arr, left, mid, right, tmp);
}
}
public static void main(String[] args) {
int[] arr = {1, 3, 6, 2, 5, 4};
mergeSort(arr, 0, arr.length - 1, new int[arr.length]);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
}
}
1.归并排序利用了完全二叉树的性质,最好最坏与平均时间复杂度均为O(nlogn)。
2.归并排序是一种稳定排序算法。
前面介绍的排序算法,都是内部排序算法,即排序都是在内存中完成的。如果待排序的数据量太大,内存中无法一次性装载所有数据,这个时候就需要使用到外部排序算法,常见的即为外部归并排序。
常见的步骤为:
1.根据内存大小,将待排序的大数据量平均分为n份,其中每份数据量均小于可用内存。依次将每份数据读入内存并排序,将排序完毕的数据存入外部存储系统比如磁盘,为下一份数据腾出内存空间进行排序。
2.对n份小数据进行合并,最终得到一个整体有序的大文件。
1.https://www.cnblogs.com/chengxiao/p/6194356.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。