归并排序
假如我们有两个有序数组,我们需要合并到一个数组里,并且重新进行排序。
A数组: [1, 23, 5, 37, 9, 99, 201]
B数组: [12, 4, 6, 18, 100]
介绍第五种排序算法:
归并排序
前提:
两个数组必须有序。
核心思想:
- 创建一个新数组,容量为两个数组的长度和。
- 遍历A,B两个数组中的元素,进行比较,较小的先放入新数组中,较大的后放入数组。
- 当有一个数组遍历完毕后,再将另一个数组中的元素全部放入新数组中,完成归并排序。
示例代码:
package com.evan.merge_sort;
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) {
int[] firstArray = {1, 23, 5, 37, 9, 99, 201};
int[] secondArray = {12, 4, 6, 18, 100};
System.out.println("A数组: " + Arrays.toString(firstArray));
System.out.println("B数组: " + Arrays.toString(secondArray));
Arrays.sort(firstArray);
Arrays.sort(secondArray);
System.out.println("排序后A数组: " + Arrays.toString(firstArray));
System.out.println("排序后B数组: " + Arrays.toString(secondArray));
int[] mergeSort = mergeSort(firstArray, secondArray);
System.out.println("归并排序后: " + Arrays.toString(mergeSort));
}
public static int[] mergeSort(int[] a, int[] b) {
if(null == a || null == b || a.length == 0 || b.length == 0) {
return null;
}
int[] result = new int[a.length + b.length];
int i = 0, j = 0, target = 0;
while(i < a.length && j < b.length) {
int aElement = a[i];
int bElement = b[j];
if(aElement <= bElement) {
result[target] = aElement;
i++;
target++;
}else {
result[target] = bElement;
j++;
target++;
}
}
if(i < a.length) {
for (int k = i; k < a.length; k++) {
result[b.length + i] = a[i];
}
}
if(j < b.length) {
for (int k = j; k < b.length; k++) {
result[a.length + k] = b[k];
}
}
return result;
}
}