0.时间复杂度
lgn * n
1.Java实现
private static void println(int[] array) {
for (int item : array) {
System.out.print(item + " ");
}
System.out.println();
}
private static void mergeSortByIndex(int[] array, int startIndex, int endIndex) {
// 最小处理块1 然后依次往上层归并
if (startIndex < endIndex) {
int centerIndex = (startIndex + endIndex) / 2;
mergeSortByIndex(array, startIndex, centerIndex);
mergeSortByIndex(array, centerIndex + 1, endIndex);
mergeArray(array, startIndex, centerIndex, endIndex);
}
}
private static void mergeArray(int[] array, int startIndex, int centerIndex, int endIndex) {
int[] tempArray = new int[endIndex - startIndex + 1];
int leftIndex = startIndex;
int rightIndex = centerIndex + 1;
boolean leftFlag = true;
boolean rightFlag = true;
int temp = 0;
while (temp <= endIndex - startIndex) {
if (leftIndex > centerIndex) {
leftFlag = false;
}
if (rightIndex > endIndex) {
rightFlag = false;
}
if (leftFlag && rightFlag) {
// 左右2边都有
// if (array[leftIndex] <= array[rightIndex]) {
if (array[leftIndex] >= array[rightIndex]) {
tempArray[temp] = array[leftIndex];
leftIndex ++;
} else {
tempArray[temp] = array[rightIndex];
rightIndex ++;
}
} else if (!leftFlag && !rightFlag) {
// 左右2边都没有
break;
} else if (!leftFlag && rightFlag) {
// 只有右边有
tempArray[temp] = array[rightIndex];
rightIndex ++;
} else {
// 只有左边有
tempArray[temp] = array[leftIndex];
leftIndex ++;
}
temp ++;
}
// 复制到原数组中
for (int copyIndex = 0; copyIndex < tempArray.length; copyIndex ++) {
array[startIndex + copyIndex] = tempArray[copyIndex];
}
}
private static void mergeSort(int[] array) {
mergeSortByIndex(array, 0, array.length - 1);
}
public static void main(String[] args) throws Exception {
// int[] array = {10, 9, 8};
int[] array = {8, 9, 10};
println(array);
mergeSort(array);
println(array);
}