数组排序——归并排序
1、数组排序之归并排序
归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作。
如:设有数列 {6,202,100,301,38,8,1}
初始状态: [6] [202] [100] [301] [38] [8] [1]
比较次数:
i=1 [ 6 202 ] [ 100 301] [ 8 38] [ 1 ]
i=2 [ 6 100 202 301 ] [ 1 8 38 ]
i=3 [ 1 6 8 38 100 202 301 ]
2、代码演示:
package cn.itcast_01;
public class ArraySort_mergeSort {
public static void main(String[] args) {
// 定义一个数组
int[] arr = { 6, 202, 100, 301, 38, 8, 1 };
// int[] arr = { 8, 3, 2, 6, 7, 1, 5, 4 };
// int[] arr = { 24 };
// int[] arr = {};
System.out.println("排序前:");
printArray(arr);
// 调用归并排序算法
int n = arr.length;
mergeSort(arr, 0, n - 1);
System.out.println("排序后:");
printArray(arr);
}
// 归并排序法merge()+mergeSort()
// 一次归并算法4参
public static void merge(int[] r, int low, int mid, int high) {
// 开辟新的数组空间
int[] B = new int[r.length];
for (int i = low; i <= high; i++) {
B[i] = r[i];
}
int i = low;
int j = mid + 1;
int k = i;
for (; i <= mid && j <= high; ++k) {
if (B[i] <= B[j]) {
r[k] = B[i++];
} else {
r[k] = B[j++];
}
}
// 第一个表没有检测完
while (i <= mid) {
r[k++] = B[i++];
}
// 第二个表没有检测完
while (j <= high) {
r[k++] = B[j++];
}
}
// 2路归并非递归算法3参
public static void mergeSort(int[] r, int low, int high) {
if (low < high) {
// 从中间划分为两个子序列
int mid = (low + high) / 2;
// 对左侧子序列进行递归排序
mergeSort(r, low, mid);
// 对右侧子序列进行递归排序
mergeSort(r, mid + 1, high);
// 归并
merge(r, low, mid, high);
}
}
// 数组遍历
public static void printArray(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i]);
} else {
System.out.print(arr[i] + ", ");
}
}
System.out.println("]");
}
}