归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
归并排序是一种外部排序,主要用来解决内存限制,数据无法一次放入内存,而这时需要用来归并排序来进行数据的排序处理。
相比较来说,JDK库里大部分都优先采用快速排序。因为快排的空间复杂度更好。

测试程序:
public static void main(String[] args) {
int[] arr = new int[20];
for (int i = 0; i < arr.length; i++) {
arr[i] = (int)(Math.random()*100);
}
mergeSort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr));
}
/**
* 实现归并排序
* @param arr
* @param i
* @param j
*/
private static void mergeSort(int[] arr, int i, int j) {
if(i < j)
{
int mid = (i+j)/2;
/**
* 以下的操作,先进行数组划分,直到划分为单个元素以后,逐级向上回溯
* 的时候,进行合并操作
*/
mergeSort(arr, i, mid);
mergeSort(arr, mid+1, j);
merge(arr, i, j); // 合并两个有序的序列
}
}
/**
* 合并两个有序的序列
* @param arr
* @param low
* @param high
*/
private static void merge(int[] arr, int low, int high) {
int[] tmp = new int[high-low+1];
int mid = (low+high)/2; // i-mid mid+1-j
int i=low; // [i, mid]
int j=mid+1; // [mid+1, high]
int idx=0;
// 3 12 5 8
while(i <= mid && j <= high){
if(arr[i] > arr[j]){
tmp[idx++] = arr[j++];
} else {
tmp[idx++] = arr[i++];
}
}
while(i <= mid){ //
tmp[idx++] = arr[i++];
}
while(j <= high){
tmp[idx++] = arr[j++];
}
// 把tmp里面合并的有序段再写回arr的[low,high]
for(int k=low; k<=high; ++k){
arr[k] = tmp[k-low];
}
}
}
运行结果:
[2, 8, 8, 10, 21, 25, 26, 29, 32, 41, 43, 50, 50, 64, 72, 73, 81, 85, 93, 97]
博客介绍了归并排序,它利用归并思想,采用分治策略,是一种外部排序,用于解决内存限制下的数据排序问题。同时提到JDK库大多优先采用快速排序,因其空间复杂度更好,还给出了测试程序及运行结果。
108

被折叠的 条评论
为什么被折叠?



