Java 中合并 k 个已排序数组
假设我们有 n 个数组,例如三个整数类型的数组 arr1[]、arr2[] 和 arr3[]。任务是在运行时以某种方式合并所有给定的整数数组,使得结果数组是有序的。
让我们通过例子来理解
输入 −
int
a[]={21,22,23,24};
int b[ ] ={28,31,35}
输出 −int resultant[ ]={21,22,23,24,28,31,35}.
解释 − 在添加数组元素之前会进行比较,并根据它们在结果数组中的合适位置添加。
输入 −
int
a[]={1,3,5,7,9,11,13};
int b[ ] ={14,16,18}
int c[ ] ={19,20,21,22}
输出 − int resultant[ ]={1,3,5,7,9,11,13,14,16,18,19,20,21,22}.
解释 − 在添加数组元素之前会进行比较,并根据它们在结果数组中的合适位置添加。
下面程序中使用的方法如下:
输入三个整数数组,例如 arr1[]、arr2[] 和 arr3[],以及一个作为结果的数组 result[],并将其设置为对方法的调用,例如 mergeSortedArray(new int[][] { arr1, arr2, arr3 })
在方法 mergeSortedArray(new int[][] { arr1, arr2, arr3 }) 内部
创建一个优先级队列类型的变量作为队列,以及一个变量 total 并将其设置为 0。
从 i 为 0 开始循环到数组长度,并将数组桶中的元素添加到声明为队列的变量中,并将 total 设置为 total + arr[i].length。
将 m 设置为 0 并声明 result[] 整数数组。
开始 while 循环,当 queue.isEmpty() = false 时,设置 ArrayBucket ac 为 queue.poll(),result[m++] 为 ac.arr[ac.index],并检查 IF ac.index 小于 ac.arr.length - 1,然后设置 queue.add(new ArrayBucket(ac.arr, ac.index + 1))
返回 result
示例
import java.util.Arrays; import java.util.PriorityQueue; class ArrayBucket implements Comparable<ArrayBucket>{ int[] arr; int index; public ArrayBucket(int[] arr, int index){ this.arr = arr; this.index = index; } @Override public int compareTo(ArrayBucket o){ return this.arr[this.index] - o.arr[o.index]; } } public class testClass{ public static int[] mergeSortedArray(int[][] arr){ PriorityQueue<ArrayBucket> queue = new PriorityQueue<ArrayBucket>(); int total = 0; for (int i = 0; i < arr.length; i++){ queue.add(new ArrayBucket(arr[i], 0)); total = total + arr[i].length; } int m = 0; int result[] = new int[total]; while (!queue.isEmpty()){ ArrayBucket ac = queue.poll(); result[m++] = ac.arr[ac.index]; if (ac.index < ac.arr.length - 1){ queue.add(new ArrayBucket(ac.arr, ac.index + 1)); } } return result; } public static void main(String[] args){ int[] arr1 = { 1, 3, 5, 7 }; int[] arr2 = { 2, 4, 6, 8 }; int[] arr3 = { 0, 9, 10, 11 }; int[] result = mergeSortedArray(new int[][] { arr1, arr2, arr3 }); System.out.println("The final merged sorted array is :- "+Arrays.toString(result)); } }
输出
如果我们运行以上代码,它将生成以下输出
The final merged sorted array is :-[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]