Java MergeSort
代码如下:
public static void main(String[] args) {
int[] array = { 1, 6, 4, 5, 2, 9, 7, 23, 56, 43, 98, 56, 11 };
int[] temp = new int[array.length];
mergeSort(array, temp, 0, array.length - 1);
StringBuilder sb = new StringBuilder();
for (int a : array) {
sb.append(a + " ");
}
System.out.println(sb);
}
public static void mergeSort(int[] array, int[] temp, int start, int end) {
//只有一个数据,不用排序了
if (start >= end) {
return;
}
//这里不能写成int mid = (end - start + 1) / 2 + start,否则start为0,end为1会出问题
int mid = (start + end) / 2;
mergeSort(array, temp, start, mid);
mergeSort(array, temp, mid + 1, end);
merge(array, temp, start, mid, end);
}
public static void merge(int[] array, int[] temp, int start, int mid, int end) {
int leftIndex = start;
int rightIndex = mid + 1;
int tempIndex = start;
while (leftIndex <= mid && rightIndex <= end) {
if (array[leftIndex] <= array[rightIndex]) {
temp[tempIndex++] = array[leftIndex++];
} else {
temp[tempIndex++] = array[rightIndex++];
}
}
while (leftIndex <= mid) {
temp[tempIndex++] = array[leftIndex++];
}
while (rightIndex <= end) {
temp[tempIndex++] = array[rightIndex++];
}
for (int index = start; index <= end; index++) {
array[index] = temp[index];
}
}
或者如下:
public static void main(String[] args) {
int[] array = { 1, 6, 4, 5, 2, 9, 7, 23, 56, 43, 98, 56, 11 };
mergeSort(array, 0, array.length - 1);
StringBuilder sb = new StringBuilder();
for (int a : array) {
sb.append(a + " ");
}
System.out.println(sb);
}
public static void mergeSort(int[] array, int start, int end) {
if (start >= end) {
return;
}
//这里不能写成int mid = (end - start + 1) / 2 + start,否则start为0,end为1会出问题
int mid = (start + end) / 2;
mergeSort(array, start, mid);
mergeSort(array, mid + 1, end);
merge(array, start, mid, end);
}
public static void merge(int[] array, int start, int mid, int end) {
int[] tmpArray = new int[(end - start + 1)];
int rightIndex = start;
int leftIndex = mid + 1;
int tmpIndex = 0;
while (rightIndex <= mid && leftIndex <= end) {
if (array[rightIndex] <= array[leftIndex]) {
tmpArray[tmpIndex++] = array[rightIndex++];
} else {
tmpArray[tmpIndex++] = array[leftIndex++];
}
}
while (rightIndex <= mid) {
tmpArray[tmpIndex++] = array[rightIndex++];
}
while (leftIndex <= end) {
tmpArray[tmpIndex++] = array[leftIndex++];
}
tmpIndex = 0;
for (int i = start; i <= end; i++) {
array[i] = tmpArray[tmpIndex++];
}
}

复杂度分析:
-
时间复杂度
对n个元素归并排序 可看为对两组n/2个元素归并排序并调用Merge函数一次
所以T(n)=2T(n/2)+an=4T(n/4)+2an=…=2kT(n/2k)+kan
一直做到n/2k=1,则k=log2n,n=2k
则T(n)=2kT(1)+kan=n+a*(log2n)n
时间复杂度即为O(nlgn)
注:算法导论中lgN默认都是以2为底的 -
空间复杂度
最大为O(n) -
简单理解
树有进行log2n层,每层n个元素,每层的复杂度(n/2+n+n:进行n/2次比较,n次赋值到中间数组,n次赋值到原始数组)
所以时间复杂度为O(nlog2n)

浙公网安备 33010602011771号