Ho provato a scrivere gli algoritmi Merge-Sort e Quick-Sort, ma ci sono dei problemi.

Per il QuickSort, ho uno stackOverflow che non capisco da cosa dipenda,

codice:
public class QuickSort
{
	public static void main(String [] args)
	{
		int [] a={5,4,6,7,8,0};
		QSort(a,0,a.length-1);
		for(int i=0; i<a.length; i++)
		System.out.print(a[i]+" ");
	}
	
	
	public static void QSort(int [] A, int i, int j)
	{
		if(i>=j) return;
		
			int r=partition(A,i,j);   //primo stackOverflow
			QSort(A,i,r);             //Altro stackOverflow che si ripete.
			QSort(A,r+1,j);
	}
	
	public static int partition(int [] A, int p, int r)
	{
		int i=p-1;
		int j=r+1;
		int x=A[r];
		
		while(true)
		{
			do j=j-1;
			while(A[j]>x);
				
			
				do i=i+1;
				while(A[i]<x);
					
			    
					if(i<j)
						swap(A,i,j);
					
			else return j;
		}
	}
	
	public static void swap(int [] A,int a, int b)
	{
		int tmp=A[a];
		A[a]=A[b];
		A[b]=tmp;
	}
	
	
}
E poi problemi nel Merge-Sort, l'ho preso da wikipedia, mi va in loop...

codice:
public class MergeSort
{
	
	public static void main(String [] args)
	{
		int [] a={3,6,5,7,9,8,0,5};
		MSort(a,0,a.length-1);
		for(int i=0; i<a.length; i++)
		System.out.print(a[i]+" ");
	}
	
	
	public static void merge(int [] a, int left,int center, int right)
	{
		int [] S=new int[a.length-1];
		int i= left;
		int j=center+1;
		int k=0;
	
		
		while(i<center && j<right)
		{
			if(a[i]<a[j])
			{
				S[k++]=a[i];
				i=i++;
			}
			else if(a[i]>a[j])
			{
				S[k++]=a[j];
				j=j++;
			}
		}
		
		while(i<center)
		{
			S[k++]=a[i];
			i=i++;
		}
		
		while(j<right)
		{
			S[k++]=a[j];
			j=j++;
		}
		
		for(k=left; k<right; k++)      //non sono molto convinto del funzionamento di questa istruzione
		a[k]=S[k-left];
	}
	
	
	public static void MSort(int [] a,int left, int right)
	{
		
		if(left>=right) return;
		
			
			int center=(left+right)/2;
				MSort(a,left,center);
				MSort(a,center+1,right);
				merge(a, left,center,right);
	
	}
}