Java基础知识强化55:经典排序之归并排序(MergeSort)

时间:2021-12-21 23:25:46

1. 归并排序的原理:

原理,把原始数组分成若干子数组,对每一个子数组进行排序,

继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组

举例:

无序数组[6 2 4 1 5 9]

  先看一下每个步骤下的状态,完了再看合并细节

第一步: [6 2 4 1 5 9]原始状态

第二步: [2 6] [1 4] [5 9]两两合并排序,排序细节后边介绍

第三步: [1 2 4 6] [5 9]继续两组两组合并

第四步: [1 2 4 5 6 9]合并完毕,排序完毕

       输出结果:[1 2 4 5 6 9]

2. 归并排序代码实现:

 package com.himi.classisort;

 /**
* 归并排序
* 简介:将两个(或两个以上)有序表合并成一个新的有序表 即把待排序序列分为若干个子序列,每个子序列是有序的。
* 然后再把有序子序列合并为整体有序序列
* 时间复杂度为O(nlogn)
* 稳定排序方式
* @param nums 待排序数组
* @return 输出有序数组
*/
public class MergeSoreDemo {
public static void main(String[] args) {
int[] array = new int[] { 12, 33, 4, 15, 25, 55, 18 };
System.out.println("排序前的数组:");
printArray(array);
sort(array, 0, array.length-1); System.out.println("");
System.out.println("排序后的数组:");
printArray(array); } public static int[] sort(int[] nums, int low, int high) {
int mid = (low + high) / 2;
if (low < high) {
// 左边
sort(nums, low, mid);
// 右边
sort(nums, mid + 1, high);
// 左右归并
merge(nums, low, mid, high);
}
return nums;
} 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++];
} // 把新数组中的数覆盖nums数组
for (int k2 = 0; k2 < temp.length; k2++) {
nums[k2 + low] = temp[k2];
}
} public static void printArray(int[] array) {
System.out.print("[");
int i;
for (i = 0; i < array.length; i++) { if (i == array.length - 1) {
System.out.print(array[i]);
} else {
System.out.print(array[i] + ",");
}
}
System.out.print("]");
}
}

程序运行结果如下:

Java基础知识强化55:经典排序之归并排序(MergeSort)