概述
归并排序是一种分治思想的排序,有2种:自上而下和自下而上。这里讨论的是自上而下的。
如下图所示:
关键步骤:
1、将数组分成2部分,middle=(low+high)/2;
1、继续对2部分把数组进行分割,使用递归直到分割成一个元素一组;
2、将已排序的两个子区间a[low…mid]和 a[mid+1…high]归并为一个有序的区间a[low…high]。
时间复杂度:
归并排序的形式就是一棵二叉树,它需要遍历的次数就是二叉树的深度,而根据完全二叉树的可以得出它的时间复杂度是O(N*lgN)。
归并排序稳定性
归并排序是稳定的算法。
java实现代码:
package test;
/**
* 自上向下,归并排序
* @author duola
*
*/
public class mergeSort2 {
private static int[] sort(int[] a, int left, int right) {
int middle = (left + right)/2;
if (left < right) {
sort(a, left, middle);
sort(a, middle + 1, right);
merge(a, left, middle, right);
}
return a;
}
private static int[] merge(int[] array, int l, int m, int r) {
int i = l, j = m + 1, k = 0;
int[] res = new int[r - l + 1];
while (i <= m && j <= r) {
if (array[i] < array[j]) {
res[k] = array[i];
i++;
k++;
} else {
res[k] = array[j];
k++;
j++;
}
}
while (i <= m) {
res[k++] = array[i++];
}
while (j <= r) {
res[k++] = array[j++];
}
for (int n = 0; n < res.length; n++) {
array[n+l]=res[n];
}
return array;
}
public static void main(String[] args) {
int[] test = { 1,3,2, 5, 2, 6, 2 };
int[] re=sort(test,0,test.length-1);
for(int i=0;i<re.length;i++){
System.out.print(re[i]);
}
}
}