第五种排序算法:归并排序
/**
* 归并排序:
* 基本思想:
* 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,
* 即把待排序序列分为若干个子序列,每个子序列是有序的。
* 然后再把有序子序列合并为整体有序序列。
*
* 时间复杂度:O(nlog2 n)
* 空间复杂度:O(n)
*
* 稳定性:稳定
*
*/
归并排序示例代码如下:
/**
* 归并排序:
* 基本思想:
* 归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,
* 即把待排序序列分为若干个子序列,每个子序列是有序的。
* 然后再把有序子序列合并为整体有序序列。
*
* 时间复杂度:O(nlog2 n)
* 空间复杂度:O(n)
*
* 稳定性:稳定
*
*/
public class MergeSort {
public static void main(String[] args) {
int arr[] = {1,4,6,8,2,5,3,7,9};
System.out.println("数组排序前顺序:");
for(int n : arr){
System.out.print(n+" ");
}
//归并排序
int lower = 0;
int upper = arr.length-1;
mergeSort(arr, lower, upper);
System.out.println("\n数组排序后顺序:");
for(int n : arr){
System.out.print(n+" ");
}
}
//归并排序
private static void mergeSort(int[] arr, int lower, int upper) {
if (lower < upper) {
//找出中间索引
int middle = (lower + upper)/2;
//对左边数组进行递归
mergeSort(arr, lower, middle); //注意:此处和快速排序不一样,middle不需要减1,组成一个完整序列的下标
//对右边数组进行递归
mergeSort(arr, middle+1, upper);
//合并
merge(arr, lower, middle, upper);
}
}
//归并
private static void merge(int[] arr, int lower, int middle, int upper) {
int[] tempArr = new int[arr.length]; //建立一个中间数组
int mid = middle + 1; // 第二个子序列的第一个下标
int third = lower; //third记录中间数组的索引
int temp = lower;
while (lower <= middle && mid <= upper) {
//从两个数组中取出最小的放入中间数组
if (arr[lower] <= arr[mid]) {
tempArr[third++] = arr[lower++];
} else {
tempArr[third++] = arr[mid++];
}
}
//剩余部分依次放入中间数组
while (mid <= upper) {
tempArr[third++] = arr[mid++];
}
while (lower <= middle) {
tempArr[third++] = arr[lower++];
}
//将中间数组中的内容复制回原数组
while (temp <= upper) {
arr[temp] = tempArr[temp++];
}
}
}