1.时间复杂度为O(nlog(n)),
非降序
代码:
package com.cn.insertion;
/**
* 归并排序,采用分治法的策略
* @author Administrator
*
*/
public class Merge_Sort {
public static void main(String[] args) {
int[] a = new int[]{10, 9, 8, 6, 7, 5, 4, 3, 2, 1};
mergeSort(a, 0, 9);
for (int i = 0; i < a.length; i++) {
System.out.println(a[i]);
}
}
/**
* 先分在和,逐层递归
* @param a
* @param p
* @param r
*/
public static void mergeSort(int[] a, int p, int r) {
if (p < r) {
int q = (p + r)/2;
mergeSort(a, p, q);
mergeSort(a,q + 1, r);
merge(a, p, q, r);
}
}
/**
* 归并函数
* @param a
* @param p
* @param q
* @param r
*/
public static void merge(int[] a, int p, int q, int r) {
//用另外两个数组来保存前面与后面的两段
int n1 = q - p + 1;
int n2 = r - q;
int[] m = new int[n1 + 1];
int[] n = new int[n2 + 1];
//保存p--q段
for (int i = 0; i < m.length - 1; i++) {
m[i] = a[p + i];
}
m[n1] = Integer.MAX_VALUE;//哨兵牌
//保存q--r段
for (int i = 0; i < n.length - 1; i++) {
n[i] = a[q + i + 1];
}
n[n2] = Integer.MAX_VALUE;//哨兵牌
int i = 0, j = 0;
//归并的过程,每次去小的那一个,i, j让两个数组一只往后走
for (int k = p; k <= r; k++) {
if (m[i] < n[j]) {
a[k] = m[i];
i++;
}
else {
a[k] = n[j];
j++;
}
}
}
}