Non capisco perchč questi algoritmi che ho scritto in passato non funzionino, praticamente ho un ArrayIndexOutOfBoundsException, ma non sono riuscito a capire perchč nel Quicksort non funzioni la procedura partition:

codice:
public class QuickSort
{
	public static void main(String [] args)
	{
		int [] a={5,4,6,7,8,0};
		QSort(a,0,a.length-1);
	}
	
	
	public static void QSort(int [] A, int i, int r)
	{
		if(i>=r) return;
		else{
			int n=partition(A,i,r);
			QSort(A,i,n);
			QSort(A,n+1,r);
			}
	}

	public static int partition(int [] A, int i, int r)
	{
		int a=i-1;
		int b=r+1;
		int p=A[r];
		
		while(true)
		{
			b--;
			
			while(A[b]>p)
				b--;
			
		     a=a+1;
			
			while(A[a]<p)
				a=a+1;
			if(a<b)
				swap(A, a, b);
			
		else return p;
		}
	}
	
	public static void swap(int [] A,int a, int b)
	{
		int tmp=A[a];
		A[a]=A[b];
		A[b]=tmp;
	}
	
	
}