【问题标题】:Recursive Merge sort in javajava中的递归合并排序
【发布时间】:2015-03-02 05:04:41
【问题描述】:

我一直在研究合并排序作为算法和可视化。当我完成编码部分时,这对我来说有点挑战。但是,我仍然使用运行时错误进行编码。错误是 NullPointerException。请帮我。这是一个学校项目。

public class test
{       
    public static void main (String[]args)
    {               
        int arr[]={11,34,65,89,1,456,90,85,12,70};
        mergesort(arr,0,9);
        for(int a=0;a<arr.length;a++)
            System.out.println(arr[a]);
    }

    public static void mergesort (int arr[], int low, int high)
    {           
        int middle;
        if(low<high)
        {
        middle = (low+high)/2;
        mergesort(arr,low,middle);
        mergesort(arr,middle+1,high);
        merge(arr,low,middle,high);
        }           
    }

    public static void merge(int arr[], int low, int middle, int high)
    {
        Queue<Integer> buffer1 = new LinkedList<Integer>();     
        Queue<Integer> buffer2 = new LinkedList<Integer>(); 
        int i;

        for(int a=low;a<middle;a++) buffer1.add(arr[a]);
        for(int a=middle+1;a<high;a++) buffer2.add(arr[a]);
        i=low;
        while(!(buffer1.isEmpty()) && !(buffer2.isEmpty()))
        {
            if(buffer1.peek() <= buffer2.peek())
            {
                arr[i] = buffer1.poll();

            } else
            {
                arr[i] = buffer2.poll();                    
            }               
        }
        while(!(buffer1.isEmpty()))
        {
            arr[i] = buffer1.poll();
        }
        while(!(buffer2.isEmpty()))
        {
            arr[i] = buffer2.poll();
        }
    }

}

【问题讨论】:

  • 堆栈跟踪有什么要说的......哪一行等?你能突出显示上面代码中的那一行吗?
  • 你说空指针异常,所以你可以从日志中粘贴整个部分。它会说它发生在第 XXX 行,所以它是上面代码中的哪一行。
  • 我更新了代码。它包含完整的实现。错误在第 18 行。它在递归部分。
  • 请问第 18 行是哪一行?你能在代码中突出显示它吗?
  • while 表达式后面为什么要加分号

标签: java recursion merge queue mergesort


【解决方案1】:

像这样改变你的 for 循环

for(i=low;i<=middle;i++)
{
    buffer1.add(arr[i]);                
}
for(i=middle+1;i<=high;i++)
{
    buffer2.add(arr[i]);
}

这里lowhigh分别表示数组的firstlast元素的索引。

【讨论】:

  • 那么,唯一的区别是你加的等于条件吧?
  • 仍然无法正常工作。问题出在 main 方法的调用中。它给出了 NullPointerException 运行时错误..
【解决方案2】:

这是更新后的代码,运行正常,没有编译和运行时错误:

public class Merge 
{

public static void mergesort(int arr[], int low, int high)
{
    int middle;
    if(low<high)
    {
        middle = (low+high)/2;
        mergesort(arr,low,middle);
        mergesort(arr,middle+1,high);
        merge(arr,low,middle,high);
    }
}
public static void merge(int arr[], int low, int middle, int high)
{
    Queue<Integer>half1 = new LinkedList<Integer>();
    Queue<Integer>half2 = new LinkedList<Integer>();

    for(int j = low; j<=middle;j++)
        {               
            half1.add(arr[j]);
        }
    for(int j= middle+1 ; j<=high ; j++)
        {
            half2.add(arr[j]);
        }
    int i = low;
    while(!(half1.isEmpty() || half2.isEmpty()))
    {
        if(half1.peek() <= half2.peek())
        {
            arr[i++] = half1.poll();

        }
        else {arr[i++] = half2.poll();}
    }

    while(!half1.isEmpty())
    {
        arr[i++] = half1.poll();
    }
    while(!half2.isEmpty())
    {
        arr[i++] = half2.poll();
    }
}

    public static void main (String[]args)
    {
         int arr[] = {11,45,90,121,67,19,54,28,7,50}; 
         mergesort(arr,0,arr.length-1);

         for(int a=0;a<arr.length;a++)
              System.out.println(arr[a]);
    }
 }  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 2013-03-15
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    相关资源
    最近更新 更多