* 归并排序
* 最好时间复杂度、最坏时间复杂度、平均时间复杂度都是o(nlog2n)
* 和堆排序、快速排序的时间复杂度一样
* <p>
* 空间复杂度:o(n)
**
* 归并排序
* 最好时间复杂度、最坏时间复杂度、平均时间复杂度都是o(nlog2n)
* 和堆排序、快速排序的时间复杂度一样
* <p>
* 空间复杂度:o(n)
*/
public class MergeSort {
public static void main(String[] args) {
int[] arr = {49, 38, 65, 97, 76, 13, 27, 49};
mergeSort(arr,0,arr.length-1);
System.out.println(Arrays.toString(arr));
}
public static void mergeSort(int[] arr,int low,int high) {
//这里mid的计算容易出错
//int mid = (high-low)/2+low;
int mid = (low+high)/2;
if (low < high){
mergeSort(arr,low,mid);
mergeSort(arr,mid+1,high);
merge(arr,low,mid,high);
}
}
/**
* 从low(含)到mid(含)为第一个已经排好序的子序列
* 从mid+1(含)到high(含)为第二个已经排好序的子序列
* 现在要把这两个子序列归并为一个有序的序列
*
* @param arr
* @param low
* @param mid
* @param high
*/
public static void merge(int[] arr, int low, int mid, int high) {
int[] newArr = new int[arr.length];
for (int i = low; i <= high; i++) {
newArr[i] = arr[i];
}
int i = low, j = mid + 1, k = low;
while (i <= mid && j <= high) {
while (i <= mid && j <= high && newArr[i] <= newArr[j]) {
arr[k] = newArr[i];
i++;
k++;
}
while ( i <= mid && j <= high && newArr[i] > newArr[j]) {
arr[k] = newArr[j];
j++;
k++;
}
}
while (i <= mid) {
arr[k++] = newArr[i++];
}
while( j <= high){
arr[k++] = newArr[j++];
}
}
}