Java 带堆栈的非递归快速排序
我正在尝试使用堆栈实现快速排序而不使用递归。排序方法应该是分区,并将子列表的边界存储为堆栈中的数组。然后,sort方法将循环并弹出其中一个子列表,并对其进行分区,然后再推回两个子列表。这应该一直持续到整个字符串数组被排序为止 存储在堆栈中的数组由于某种原因而改变,即使我(据我所知)没有接触堆栈。这使这一类脱轨 代码如下:Java 带堆栈的非递归快速排序,java,stack,quicksort,Java,Stack,Quicksort,我正在尝试使用堆栈实现快速排序而不使用递归。排序方法应该是分区,并将子列表的边界存储为堆栈中的数组。然后,sort方法将循环并弹出其中一个子列表,并对其进行分区,然后再推回两个子列表。这应该一直持续到整个字符串数组被排序为止 存储在堆栈中的数组由于某种原因而改变,即使我(据我所知)没有接触堆栈。这使这一类脱轨 代码如下: public static void qsort (String [] data) { Stack stk = new Stack
public static void qsort (String [] data)
{
Stack stk = new Stack ();
Integer mid;
Integer [] bounds = new Integer [2];
bounds [0] = 0;
bounds [1] = data.length - 1;
Integer [] rlist = new Integer [2];
Integer [] llist = new Integer [2];
while (!stk.isEmpty())
{
System.out.println ("----------");
bounds = stk.pop();
stk.print();
System.out.println ("lb " + bounds[0].intValue() + " rb " + bounds [1].intValue());
print (data);
stk.print();
llist[0] = bounds[0];
System.out.println ("l0 " + llist[0].intValue() + " mid: " + mid.intValue() + " b0 " + bounds[0].intValue() + " b1 " + bounds[1].intValue());
llist[1] = new Integer (mid.intValue()-1);
System.out.println ("l0 " + llist[0].intValue() + " l1 " + llist[1].intValue() + " mid: " + mid.intValue() + " b0 " + bounds[0].intValue() + " b1 " + bounds[1].intValue());
stk.print();
rlist[0] = new Integer (mid.intValue()+1);
System.out.println ("l0 " + llist[0].intValue() + " l1 " + llist[1].intValue() + " mid: " + mid.intValue() + " r0 " + rlist[0].intValue());
rlist[1] = bounds[1];
System.out.println ("l0 " + llist[0].intValue() + " l1 " + llist[1].intValue() + " mid: " + mid.intValue() + " r0 " + rlist[0].intValue() + " r1 " + rlist[1].intValue());
if (rlist[1].intValue() > rlist[0].intValue())
{
stk.push (rlist);
System.out.println ("pushed right");
}
if (llist[1].intValue() > llist[0].intValue())
{
stk.push (llist);
System.out.println ("pushed left");
}
System.out.println("stksize "+stk.size);
stk.print();
}
}
为了调试,我添加了一堆print语句。对于给定的输入:
q
w
e
r
a
t
我得到这个输出:
----------
---
---
lb 0 rb 5
a
e
q
r
w
t
---
---
l0 0 mid: 2 b0 0 b1 5
l0 0 l1 1 mid: 2 b0 0 b1 5
---
---
l0 0 l1 1 mid: 2 r0 3
l0 0 l1 1 mid: 2 r0 3 r1 5
pushed right
pushed left
stksize 2
---
l 0 r 1
l 3 r 5
---
----------
---
l 3 r 5
---
lb 0 rb 1
a
e
q
r
w
t
---
l 3 r 5
---
l0 0 mid: 0 b0 0 b1 1
l0 0 l1 -1 mid: 0 b0 0 b1 -1
---
l 3 r 5
---
l0 0 l1 -1 mid: 0 r0 1
l0 0 l1 -1 mid: 0 r0 1 r1 -1
stksize 1
---
l 1 r -1
---
----------
---
---
lb 1 rb -1
a
e
q
r
w
t
---
---
l0 1 mid: 1 b0 1 b1 -1
l0 1 l1 0 mid: 1 b0 1 b1 -1
---
---
l0 1 l1 0 mid: 1 r0 2
l0 1 l1 0 mid: 1 r0 2 r1 -1
stksize 0
---
---
a
e
q
r
w
t
我通过打印“----------”来分隔每个迭代。请注意,存储在堆栈中的值正在被更改,我正在为无关变量重新分配值。我不明白。您正在尝试对字符串[]数组数据进行排序,但从未将任何数据[…]元素与任何内容进行比较。循环中发生的唯一比较是在rlist和llist中,但这些保留了数据数组中的索引。