MergeSort ‘s implementation
MergetSort 的中心思想就是分治思想,通过解决每一个小问题来解决大问题
假设你有2个已经排好序的数组
数组[ 4 ][ 8 ] 和 数组[ 5 ][ 7 ] 进行排序
4 是第一个数组最小的值 和 第二个数组最小的值5 进行比较 4 < 5 所以最小的元素是4
排完第一个元素后是[ 4 ][ null ][ null ][ null ]
接着排第二个元素, 8 和 5 比较。5 比较小
所以是 [ 4 ][ 5 ][ null ][ null ],接着 第一个数组最小的值8 和第二个数组最好的值7 比较。 7 < 8
所以变成 [ 4 ][ 5 ][ 7 ][ 8 ]。
所以问题的关键就是先把2个 数组分别排序了。再merge到一个大的数组中。下面盗用一下别人的图。嘎嘎嘎
mergeSort的复杂度为NLgN。相当快的算法。并且是stable
下面给出具体的实现
//Time : N log(N) & wasting space that proportional to N public static void sort(Comparable[] a) { sort(a, new Comparable[a.length], 0, a.length - 1); } //mid 的左右都已经是有序的了, //这个是merge方法 //a 和辅助 数组的长度需要一致 /** i j * [] [] [] [ ] [] * low mid hi */ private static void sort(Comparable[] a, Comparable[] aux, int low, int hi) { if (low >= hi) return; int middle = low + (hi - low) / 2; sort(a, aux, low, middle); //sort left sort(a, aux, middle + 1, hi); // sort right merge(a, aux, low, middle, hi); } /** i j * [ ] [ ] [ ] [ ] [ ] * low mid hi */ private static void merge(Comparable[] a, Comparable[] aux,int low, int middle, int hi) { int i = low; int j = middle + 1; for (int k = low; k <= hi; k++) aux[k] = a[k]; //把元素复制到辅助数组上 for (int k = low; k <= hi; k++) { //前面2个判断条件一定要在前面。 //要不然下面比较的时候 会出现空指针异常 //因为已经有可能j 已经超出了hi的大小 if (i > middle) a[k] = aux[j++]; else if (j > hi) a[k] = aux[i++]; else if (less(aux[i],aux[j])) a[k] = aux[i++]; // else a[k] = aux[j++]; } }
merge sort
https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/sort/MergeSort.java
时间: 2024-11-05 06:11:35