相关知识
基本思想
基本思想:分治法,合并
代码实现
实现1:
public static void mergeSort(int[] array, int first, int last) {
if (first >= last) {
return;
}
int middle = (first + last) / 2;
mergeSort(array, first, middle);
mergeSort(array, middle + 1, last);
mergeArray(array, first, middle, last);
}
private static void mergeArray(int[] array, int first, int middle, int last) {
int[] buffer = new int[last - first + 1];
int i = first, j = middle + 1, k = 0;
while (i <= middle && j <= last) {
if (array[i] < array[j]) {
buffer[k++] = array[i++];
} else {
buffer[k++] = array[j++];
}
}
while (i <= middle) {
buffer[k++] = array[i++];
}
while (j <= last) {
buffer[k++] = array[j++];
}
for (i = 0; i < k; i++) {
array[first + i] = buffer[i];
}
}
实现2:共用一个缓存数组
public static void mergeSort(int[] array) {
mergeSort(array, 0, array.length - 1, new int[array.length]);
}
private static void mergeSort(int[] array, int first, int last, int[] buffer) {
if (first >= last) {
return;
}
int middle = (first + last) / 2;
mergeSort(array, first, middle, buffer);
mergeSort(array, middle + 1, last, buffer);
mergeArray(array, first, middle, last, buffer);
}
private static void mergeArray(int[] array, int first, int middle, int last, int[] buffer) {
int i = first, j = middle + 1, k = 0;
while (i <= middle && j <= last) {
if (array[i] < array[j]) {
buffer[k++] = array[i++];
} else {
buffer[k++] = array[j++];
}
}
while (i <= middle) {
buffer[k++] = array[i++];
}
while (j <= last) {
buffer[k++] = array[j++];
}
for (i = 0; i < k; i++) {
array[first + i] = buffer[i];
}
}
算法复杂度
- 时间复杂度:O(NlogN)
- 空间复杂度:O(N)
算法稳定性
算法稳定性:稳定