1、合并两个有序数组
package helloworld;
import java.util.*;
public class Test {
public static void merge(int[] a, int m, int[] b, int n, int[] tmp) {//m为a的末尾元素下标,n为b的末尾元素下标
int i, j, k;
i = j = k = 0;
while (i <= m && j <= n) {//当a和b都没取完时
if (a[i] < b[j]) {//当a的元素小于b的元素时
tmp[k++] = a[i++];//把a的元素赋给tmp
} else {
tmp[k++] = b[j++];//把b的元素赋给tmp
}
}
while (i <= m) {//上面的while跳出时,是a继续不为空
tmp[k++] = a[i++];
}
while (j <= n) {
tmp[k++] = b[j++];//上面的while跳出时,是b不为空
}
}
public static void main(String[] args) {
int[] a = { 1, 2, 3 };
int[] b = { 2, 2, 3, 4, 5 };
int[] tmp = new int[a.length + b.length];//建一个数组tmp,大小为a+b的大小
merge(a, a.length - 1, b, b.length - 1, tmp);//调用merge方法
for (Integer k : tmp) {//输出tmp的元素
System.out.print(k + " ");
}
}
}
输出:
1 2 2 2 3 3 4 5
2、归并排序
import java.util.*;
public class Main {
public static void merge(int[] a, int low, int mid, int high) {//a的左子数组和右子数组都是有序的,合并
int[] temp = new int[high - low + 1];//建立一个存放元素的数组temp
int i = low;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= high) {//当左子数组和右子数组都不为空
if (a[i] < a[j]) {
temp[k++] = a[i++];
} else {
temp[k++] = a[j++];
}
}
while (i <= mid) {
temp[k++] = a[i++];
}
while (j <= high) {
temp[k++] = a[j++];
}
for (int k2 = 0; k2 < temp.length; k2++) {//将temp的元素赋给a
a[low + k2] = temp[k2];
}
}
public static void sort(int[] a, int low, int high) {//递归部分
int mid = (low + high) / 2;
if (low < high) {
sort(a, low, mid);//左子数组有序
sort(a, mid + 1, high);//右子数组有序
merge(a, low, mid, high);//再合并左右
}
}
public static void mergeSort(int[] a) {//将sort方法进行包装成mergeSort,直接输入数组
if (a != null) {
sort(a, 0, a.length - 1);
}
}
public static void main(String[] args) {
int[] a = { 9,8,7,6,5,1,2,3,4 };
mergeSort(a);//调用mergeSort方法
System.out.println(Arrays.toString(a));
}
}
输出:
[1, 2, 3, 4, 5, 6, 7, 8, 9]