二路归并排序:
把待排序序列分为两个子序列,对每个子序列分别进行二路归并排序,再把有序的两个子序列合并为整体有序序列。
public static void mergeSort(int[] nums, int low, int high) {
int mid = (low + high) / 2;
if (low < high) {
mergeSort(nums, low, mid); // 左边归并排序
mergeSort(nums, mid + 1, high); // 右边归并排序
merge(nums, low, mid, high); // 左右两边归并为有序序列
}
}
public static void merge(int[] nums, int low, int mid, int high) {
int[] temp = new int[high - low + 1]; // 定义一个新数组存储归并结果
int i = low; // 左指针
int j = mid + 1; // 右指针
int k = 0;
// 将左边和右边对应位置的数比较,较小的先移到新数组中
while (i <= mid && j <= high) {
if (nums[i] < nums[j])
temp[k++] = nums[i++];
else
temp[k++] = nums[j++];
}
// 把左边剩余的数移入新数组
while (i <= mid)
temp[k++] = nums[i++];
// 把右边剩余的数移入新数组
while (j <= high)
temp[k++] = nums[j++];
// 把新数组复制回原数组
for (int p = 0; p < temp.length; p++)
nums[p + low] = temp[p];
}
最好时间复杂度:O(nlogn)
最坏时间复杂度:O(nlogn)
平均时间复杂度:O(nlogn)