【Java】两个排序后的数组A和B,其中A的末端有足够的缓冲容纳B。编写一个方法,将B合并入A并排序。
2015-07-22 10:36
645 查看
给定两个排序后的数组A和B,其中A的末端有足够的缓冲容纳B。编写一个方法,将B合并入A并排序。
看起来很像归并排序的最后一步,但还有些不同,由于A的末端足够容纳B,我们不需要再新建一个缓冲数组。
那么直接将A和B顺序比较插入相应位置即可,但如果从小到大比较,A的数据会被覆盖,由于A的末端是空的,我们可以从A和B最大的元素开始比较,从后往前依次插入.
要注意的是如果B的元素比A多,那么要逐一比较好几轮,才能把B的所有元素都插入A的正确位置。
反之如果A的元素比B多,则不需要这么做,因为A的元素已经在那里了,且最后一定是排好序的。
public class merge {
public static void mergeArrays(int[] a, int[] b, int lastA, int lastB) {
int round = (int)Math.ceil((double)lastB / lastA); //进一法取A和B要比较的轮数
int indexA = lastA - 1;
int indexB = lastB - 1;
int indexMerged = lastB + lastA - 1;
while (round >= 1) {
while(indexA >= 0 && indexB >= 0) {
if (a[indexA] >= b[indexB]) {
a[indexMerged--] = a[indexA--];
}
else {
a[indexMerged--] = b[indexB--];
}
}
round--;
indexA = lastA - 1;
}
}
}
看起来很像归并排序的最后一步,但还有些不同,由于A的末端足够容纳B,我们不需要再新建一个缓冲数组。
那么直接将A和B顺序比较插入相应位置即可,但如果从小到大比较,A的数据会被覆盖,由于A的末端是空的,我们可以从A和B最大的元素开始比较,从后往前依次插入.
要注意的是如果B的元素比A多,那么要逐一比较好几轮,才能把B的所有元素都插入A的正确位置。
反之如果A的元素比B多,则不需要这么做,因为A的元素已经在那里了,且最后一定是排好序的。
public class merge {
public static void mergeArrays(int[] a, int[] b, int lastA, int lastB) {
int round = (int)Math.ceil((double)lastB / lastA); //进一法取A和B要比较的轮数
int indexA = lastA - 1;
int indexB = lastB - 1;
int indexMerged = lastB + lastA - 1;
while (round >= 1) {
while(indexA >= 0 && indexB >= 0) {
if (a[indexA] >= b[indexB]) {
a[indexMerged--] = a[indexA--];
}
else {
a[indexMerged--] = b[indexB--];
}
}
round--;
indexA = lastA - 1;
}
}
}
相关文章推荐
- myEclipse2015启动myEclipse时发现了以元素"d:disk"的无效内容
- JAVA之BigInteger
- JAVA Calendar详解
- Java Web乱码分析及解决方案(三)——响应乱码
- Eclipse ADT启动报“fail to load the jni shared library”问题解决方案
- Java 应用
- 如何在一台新电脑上配置JAVA开发环境
- Java对象的序列化和反序列化
- java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/TransactionA
- (转)java中静态代码块的用法 static用法详解
- eclipse内存不足解决方案
- Java并发编程之AQS
- JAVA基础之数组
- 安装jdk出现问题:Error opening registry key'software\Javasoft\Java Runti
- 模板模式和策略模式的区别【转】
- 搭建Eclipse PHP开发环境
- GraphicsMagick+im4java 图片处理
- [MAC Eclipse] Eclipse for MAC 中文乱码的解决办法
- Struts2拦截器
- java 各类型之间转换总结