java - 合并不等长的排序数组

标签 java merge mergesort

我有一个项目要求我合并两个已排序的数组(a 和 b)并将结果放入长度为 a.length + b.length 的新数组中。 我正在跟踪我在所有 3 个数组中的位置计数器,并且我的数组长度不相等。我的约定是,如果一个数组先于另一个数组用完,代码只会将另一个数组的其余部分转储到结果数组中。

不幸的是,我可以检查另一个数组是否仍然包含元素的唯一方法是查看 for 循环。

谁能帮帮我?这应该是一个相对容易的修复,但我想不出解决方案。

public class Two {
    public static void main(String[] args) {
        //sample problem
        int[] var_a = {2,3,5,5,8,10,11,17,18,20}; 
        int[] var_b = {5,6,7,8,14,15,17};
        final int a_size = 10;
        final int b_size = 7;
        final int c_size = 17; 
        int[] var_c = new int[17];

        int aCount = 0;
        int bCount = 0;
        int cCount = 0;
        for (cCount = 0; cCount < c_size; cCount++) {
            //b runs out before a runs out
            if ((bCount == b_size) && (aCount <= a_size)) {
                //dump rest of var_a into var_c     
                var_c[cCount] = var_a[aCount];
                aCount++;
            }
            //PROBLEM: bCount is equal to bSize, and is triggering the break.
            //a runs out before b runs out
            else if ((aCount == a_size) && (bCount <= b_size)) {
                //dump rest of var_b into var_c
                var_c[cCount] = var_b[bCount];
                bCount++;
            }

            if ((aCount >= a_size) || (bCount >= b_size) || (cCount >= c_size)) {break;}

            if (var_a[aCount] < var_b[bCount]) {
                var_c[cCount] = var_a[aCount];
                aCount++;
            } else if (var_a[aCount] > var_b[bCount]) {
                var_c[cCount] = var_b[bCount];
                bCount++;
            } else if (var_a[aCount] == var_b[bCount]) {
                var_c[cCount] = var_a[aCount];
                aCount++;
                cCount++;
                var_c[cCount] = var_b[bCount];
                bCount++;
            }
        }
        for (int i : var_c) {
            System.out.print(i + " ");
        }
    }
}

最佳答案

这个问题的一个常见解决方案是用三个循环替换单个循环:

  • 第一个循环合并两个数组,直到其中一个用完元素
  • 第二个循环将数组 A 的剩余元素(如果有)转储到输出数组中
  • 第三个循环将数组 B 的剩余元素(如果有)转储到输出数组中

这个结构可以让合并循环变得更简单:

while (aCount != var_a.length() && b.Count != var_b.length()) {
    ... // merge
}
while (aCount != var_a.length()) {
    var_c[cCount++] = var_a[aCount++];
}
while (bCount != var_b.length()) {
    var_c[cCount++] = var_b[bCount++];
}

请注意,在最后两个循环中,最多会执行一个。还要注意使用 length() 方法来确定数组的长度。它比设置a_sizeb_size等更可靠。

关于java - 合并不等长的排序数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33542970/

相关文章:

Git merge "replays"发生变化,但是呢?

git - 结合 GIT 中 merge 分支的历史记录?

java - 使用合并排序(递归)按字母顺序对名称进行排序

java - HashMap 上的双重迭代具有对称结果(跳过冗余情况)

java - 如何使用 GET 调用 Web 服务?

python - Pandas 合并复制所有行

runtime - 什么时候插入排序比归并排序快?

合并排序中的 java.lang.StackOverflowError

Java TreeMultimap - 如何删除键和最近的键?

java - 在Java中解析xml时是否可以忽略/跳过节点