快速排序的java实现,该如何解决

快速排序的java实现
代码如下:

public class TestQuicksort {

int[] A;
int size;
public TestQuicksort(int s){
A = new int[s+1];
size = s;
}
public void Exchange(int i,int j){
System.out.println("Exchang"+i+" and "+j);
int t = A[i];
A[i] = A[j];
A[j] = t;
}
public int Partition(int p,int r){
int i=p-1,j=p;
int key = A[r];
System.out.println("key is "+key);
for(j=p;j<r;j++)
if(A[j] <= key)
{
System.out.println("A["+j+"] < key"+key);
i++;
Exchange(i,j);
}
Exchange(i+1,r);
return (i+1);
}
public void QuickSort(int p,int r){
if(p>=r){
System.out.println("p is "+p+",r is "+"r");
return;
}
int q = Partition(p,r);
System.out.println("q is "+q);
QuickSort(p,q);
QuickSort(q,r);
}
public void Print(){
int i;
for(i=1;i<=size;i++)
System.out.println(i+":"+A[i]);
}
public static void main(String[] args) {
int i;
TestQuicksort tq = new TestQuicksort(10);
for(i=1;i<=10;i++)
tq.A[i] = 11-i;
System.out.println("The array unsorted:");
tq.Print();
tq.QuickSort(1,10);
System.out.println("The array sorted:");
tq.Print();
}

}


Exchange是用数组下标做参数,这个没有问题。Partition 和Quicksort是按《算法导论》上的思路写的,按理说应该没问题的,但是不知道为什么 在partition内 i和j的值总是一样的,导致程序不断递归,然后栈溢出。。。。。。。我跟一个学长看了半个小时 我自己又看了将近一个小时 就是找不出来到底是哪错了。。我都快疯了。。。求各位大神帮帮忙快速排序的java实现,该如何解决
------解决方案--------------------
第36 和37行错了,改成
QuickSort(p,q-1);
QuickSort(q+1,r);