java - 非迭代合并排序算法的合并异常

标签 java arrays merge mergesort non-recursive

我正在尝试创建 MergeSort 的非递归版本,但由于某种原因,合并使代码无法完整运行。

合并排序代码:

public void mergeSort(int[] input)
{

    int n = input.length;
    int size;
    int l;
    for (size = 1; size <= n-1; size = 2*size)
    {
        for (l = 0; l < n-1; l += 2*size)
        {
            int m = l + size -1;
            int r = minimum(l + 2*size - 1, n-1);
            merge(input, l, m, r);
        }
    }       
}

合并代码:

public static void merge(int[] numbers, int low, int middle, int high)
{

    // Copy both parts into the helper array
     int helper[];
    helper = new int[numbers.length];

   for (int i = low; i <= high; i++) {
       helper[i] = numbers[i];
   }


   int i = low;
   int j = middle + 1;
   int k = low;
   // Copy the smallest values from either the left or the right side back
   // to the original array

   while (i <= middle && j <= high) {
       if (helper[i] <= helper[j]) {
            numbers[k] = helper[i];
            i++;
       } else {
            numbers[k] = helper[j];
            j++;
       }

       k++;
     }
     // Copy the rest of the left side of the array into the target array

     while (i <= middle) {
           numbers[k] = helper[i];
           k++;
           i++;
     }
 }

这就是我填充输入数组(大小为 100)的方式:

public static int fillArray()
{
    Random r = new Random();
    int rand = r.nextInt();
    return rand;
}
 //followed by these lines of code in the main method:

    int[] arr;

    arr = new int[100];

    for(int i =0; i<arr.length; i++)
    {
        arr[i] = fillArray();
    }

异常(exception)是 merge() 中的 numbers[k] = helper[i]

我知道输入数组的内容很好,因为我在对其执行合并排序之前打印出了数组的内容。有谁知道问题是什么?

最佳答案

修复 mergeSort() 中的 m,如下所示:

int m = Math.min(l + size - 1, n - 1);

关于java - 非迭代合并排序算法的合并异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32557358/

相关文章:

Java 按元素合并两个列表

arrays - 如何在 Swift 中连接或合并数组?

不能使用 const 全局变量作为数组号。结构体中的元素数量

sql - 将 SQL 中的 2 个表与一些不同的列名组合 (Transact SQL)

java - createNewFile() 不起作用并且图像未存储

java - 使用 Java 发送 JSON 消息

java - VisualVM 启动器错误

java - 使用 iText 签名,Adobe Reader 报告 "Signature was created using Not available."

ruby - 为什么在一个数组上插入/删除也会修改另一个数组?

C: 将 int[ ] 转换为字符串