使用Stacks进行非递归MergeSort?

svs*_*sav 6 java

我的教授分配了一个问题,我们必须使用Stacks(或Queues)来创建一个非递归的MergeSort.目前的代码如下:

 private static void sort(Comparable[] a, int[] index, int[] aux, int lo, int hi) {
    if (hi <= lo) return;
    int mid = lo + (hi - lo) / 2;

    sort(a, index, aux, lo, mid);
    sort(a, index, aux, mid + 1, hi);

    merge(a, index, aux, lo, mid, hi);
Run Code Online (Sandbox Code Playgroud)

我不知道如何处理这个问题,任何帮助将不胜感激.我知道我必须使用while循环来模拟递归.但是,我如何分割实际值?另外,如何跟踪分区值的中间值?

我真的很困惑这个问题.任何帮助,将不胜感激!

rpa*_*pax 11

最重要的是要了解算法的工作原理.来自维基百科:

从概念上讲,合并排序的工作原理如下:

将未排序的列表分成n个子列表,每个子列表包含1个元素(1个元素的列表被视为已排序).重复合并子列表以生成新的排序子列表,直到只剩下1个子列表.这将是排序列表.

Mergesort动画

解决方案1:使用队列.


static int[] mergeSortQueue(int[] A) {
        Queue<int[]> queue = new LinkedList<int[]>();


        for (int i = 0; i < A.length; i++)
        {
            queue.add(new int[]{A[i]});
        }
        while (queue.size()>1)
        {
                int[] r = queue.poll();
                int[] l = queue.poll();
                int[] merged=merge(l, r);
                queue.add(merged);  
        }
        return queue.poll();


    }
Run Code Online (Sandbox Code Playgroud)

从图形上看,

mergesort_queue


解决方案2:使用两个堆栈


这有点复杂.

它基本上包括合并第一个堆栈的元素,将它们插入第二个堆栈,直到只剩下一个.

static int[] mergeSortStacks(int[] A) {
        Stack<int[]> stack = new Stack<int[]>();
        Stack<int[]> stack2 = new Stack<int[]>();

        for (int i = 0; i < A.length; i++)
        {
            stack.push(new int[]{A[i]});
        }
        while (stack.size()>1)
        {
            while (stack.size()>1)
            {

                int[] r = stack.pop();
                int[] l = stack.pop();
                int[] merged=merge(l, r);
                stack2.push(merged);
            }
            while (stack2.size()>1)
            {

                int[] r = stack2.pop();
                int[] l = stack2.pop();
                int[] merged=merge(l, r);
                stack.push(merged);
            }
        }
        return stack.isEmpty() ? stack2.pop() : stack.pop();


    }
Run Code Online (Sandbox Code Playgroud)

从图形上看,

在此输入图像描述

  • 精彩回复,谢谢!但是,您的两个堆栈示例不适用于像“[7, 1, 5, 2, 9, 3]”这样的数组,因为循环完成时两个堆栈都将包含单个数组。因此,您可以在 return 语句之前添加 `if (!stack.isEmpty() &amp;&amp; !stack2.isEmpty()) return merge(stack.pop(), stack2.pop());` 。 (2认同)